Поиск по блогу

воскресенье, 4 мая 2014 г.

Видео про sockets Python c WireShark и Scapy

Запсиси при просмотре 60-минутного видео. Месяц назад мне понравилось видео для хакеров про сокеты. Этот пост - продолжение поста, в который я загрузил код сервера и клиента. Я вернулся к этому практикуму после того, как прочитал про объект "Socket"...
В конце ролика отличные примеры работы со Scapy.

Первоисточники и ссылки

Запускаем код сервера по частям

In []:
#На 23 минуте ролика автор запустил сервер
python miniserver.py
In [1]:
# #######!/usr/bin/python
import socket
import sys
 
# Create a TCP/IP socket to listen on
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 
# Prevent from "address already in use" upon server restart
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
 
# Bind the socket to port 8081 on all interfaces
server_address = ('localhost', 8081)
print 'starting up on %s port %s' % server_address
server.bind(server_address)
 
# Listen for connections
server.listen(5)
 
starting up on localhost port 8081

Следующий фрагмент сработал только после того, как я набрал в адресной строке браузера localhost:8081 , при этом в самом окне браузера ничего не появилось...
In [2]:
# Wait for one incoming connection
connection, client_address = server.accept()
print 'connection from', connection.getpeername()
connection from ('127.0.0.1', 60816)

А здесь выскочила ошибка, поскольку браузер послал совсем не то, что в видеоролике, а начал стандартные переговоры (см. ниже)
In [3]:
# Let's receive something
data = connection.recv(4096)
if data:
    print 'Received ', repr(data)
 
    # Send it back nicely formatted
    data = data.rsrtip()
    connection.send('%s\n%s\n%s\n' % ('-'*80, data.center(80), '-'*80))
    print 'Response sent!'
 
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-3-9672a8f7391b> in <module>()
      5 
      6     # Send it back nicely formatted
----> 7     data = data.rsrtip()
      8     connection.send('%s\n%s\n%s\n' % ('-'*80, data.center(80), '-'*80))
      9     print 'Response sent!'

AttributeError: 'str' object has no attribute 'rsrtip'
Received  'GET / HTTP/1.1\r\nHost: localhost:8081\r\nUser-Agent: Mozilla/5.0 (X11; Linux i686; rv:22.0) Gecko/20100101 Firefox/22.0 Iceweasel/22.0\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nAccept-Language: en-US,en;q=0.5\r\nAccept-Encoding: gzip, deflate\r\nConnection: keep-alive\r\n\r\n'

In [*]:
# Close the connection from our side
connection.shutdown(socket.SHUT_RD | socket.SHUT_WR)
connection.close
print 'Connection closed.'
 
# And stop listening
server.close()
In [*]:
#import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('localhost', 8081))
s.send('Happy Hacking')
data = s.recv(1024)
s.close()
print 'Received: '
print data
In [*]:
# Wait for one incoming connection
connection, client_address = server.accept()
print 'connection from', connection.getpeername()

Scapy на 26 минуте

In [2]:
import scapy
help (scapy)
Help on package scapy:

NAME
    scapy - Scapy: create, send, sniff, dissect and manipulate network packets.

FILE
    /usr/lib/python2.7/dist-packages/scapy/__init__.py

DESCRIPTION
    Usable either from an interactive console or as a Python library.
    http://www.secdev.org/projects/scapy

PACKAGE CONTENTS
    all
    ansmachine
    arch (package)
    as_resolvers
    asn1 (package)
    asn1fields
    asn1packet
    automaton
    autorun
    base_classes
    config
    crypto (package)
    dadict
    data
    error
    fields
    layers (package)
    main
    modules (package)
    packet
    plist
    pton_ntop
    route
    route6
    sendrecv
    supersocket
    themes
    tools (package)
    utils
    utils6
    volatile



На 35-ой минуте запустили две консоли из одной - сервер, из другой - клиент... Запишем обмен в файл WireShark, и потом откроем его в Scapy

In []:
root@kali:~/Desktop/ipython notebook/happyhacking# python Server.py
starting up on localhost port 8081
connection from ('127.0.0.1', 32872)
Received  'Happy Hacking'
Traceback (most recent call last):
  File "Server.py", line 29, in <module>
    data = data.rsrtip()
AttributeError: 'str' object has no attribute 'rsrtip'
In []:
root@kali:~/Desktop/ipython notebook/happyhacking# python Client.py
Received: 
Вызов к серверу прошел, но он не смог ответить из-за ошибки AttributeError: 'str' object has no attribute 'rsrtip' ... Клиент подвис..., тем не менее, переговоры были. Мы их записали посредством Wareshark в файл w_shark.pcap
Теперь откроем его в scapy (ниже копия из консоли scapy):
In []:
root@kali:~/Desktop/ipython notebook/happyhacking# scapy
INFO: Can't import python gnuplot wrapper . Won't be able to plot.
WARNING: No route found for IPv6 destination :: (no default route?)
Welcome to Scapy (2.2.0)

>>>rdpcap('w_shark.pcap')
#  answer was
<w_shark.pcap: TCP:152 UDP:0 ICMP:0 Other:0>
In []:
>>> _
<w_shark.pcap: TCP:152 UDP:0 ICMP:0 Other:0>
>>> cap1=_
# Присвоили имя последнему объекту, теперь можно еого показать
>>> cap1.display()
0000 Ether / IP / TCP 127.0.0.1:47524 > 127.0.0.1:51986 PA / Raw
0001 Ether / IP / TCP 127.0.0.1:51986 > 127.0.0.1:47524 PA / Raw
0002 Ether / IP / TCP 127.0.0.1:47524 > 127.0.0.1:51986 A
0003 Ether / IP / TCP 127.0.0.1:50725 > 127.0.0.1:53339 PA / Raw
0004 Ether / IP / TCP 127.0.0.1:53339 > 127.0.0.1:50725 PA / Raw
0005 Ether / IP / TCP 127.0.0.1:50725 > 127.0.0.1:53339 A
...
0033 Ether / IP / TCP 127.0.0.1:50725 > 127.0.0.1:53339 PA / Raw
0034 Ether / IP / TCP 127.0.0.1:53339 > 127.0.0.1:50725 PA / Raw
0035 Ether / IP / TCP 127.0.0.1:50725 > 127.0.0.1:53339 A
0036 Ether / IP / TCP 127.0.0.1:32872 > 127.0.0.1:tproxy S
0037 Ether / IP / TCP 127.0.0.1:tproxy > 127.0.0.1:32872 SA
0038 Ether / IP / TCP 127.0.0.1:32872 > 127.0.0.1:tproxy A
0039 Ether / IP / TCP 127.0.0.1:32872 > 127.0.0.1:tproxy PA / Raw
0040 Ether / IP / TCP 127.0.0.1:tproxy > 127.0.0.1:32872 A
0041 Ether / IP / TCP 127.0.0.1:tproxy > 127.0.0.1:32872 FA
0042 Ether / IP / TCP 127.0.0.1:32872 > 127.0.0.1:tproxy FA
0043 Ether / IP / TCP 127.0.0.1:tproxy > 127.0.0.1:32872 A
0044 Ether / IP / TCP 127.0.0.1:47524 > 127.0.0.1:51986 PA / Raw
0045 Ether / IP / TCP 127.0.0.1:51986 > 127.0.0.1:47524 PA / Raw
...
0149 Ether / IP / TCP 127.0.0.1:50725 > 127.0.0.1:53339 PA / Raw
0150 Ether / IP / TCP 127.0.0.1:53339 > 127.0.0.1:50725 PA / Raw
0151 Ether / IP / TCP 127.0.0.1:50725 > 127.0.0.1:53339 A
In []:
#После сбоя, я восстановил объект, но с именем cap2
>>> cap2=rdpcap('w_shark.pcap')
>>> cap2[3]
<Ether  dst=00:00:00:00:00:00 src=00:00:00:00:00:00 type=0x800 |<IP  version=4L ihl=5L tos=0x0 len=60 id=26307 flags=DF frag=0L ttl=64 proto=tcp 
  chksum=0xd5f6 src=127.0.0.1 dst=127.0.0.1 options=[] |<TCP  sport=50725 dport=53339 seq=556303343 ack=1428532081 dataofs=8L reserved=0L flags=PA 
  window=43 chksum=0xfe30 urgptr=0 options=[('NOP', None), ('NOP', None), ('Timestamp', (11665178, 11664428))] |<Raw  load='\x01\x00\x00\x04ping' |>>>>
>>> 
In []:
>>> cap2[3].load
'\x01\x00\x00\x04ping'
>>> print cap2[3].load
  ping
>>> print cap2[3].len
60
>>> cap2[3].len
60

На 47 минуте пример имитации сервера Apache

Здесь к файлу сервера были добавлены строки кода с константами и HTTP ответом так, чтобы в браузере открылась html-старница "Hello Word!"


Посты чуть ниже также могут вас заинтересовать

Комментариев нет:

Отправить комментарий