برای طرح سوال و دسترسی به آموزش ها  کانال ما در تلگرام بپویندید  

بدست آوردن Gateway در Python با scapy

شاید هنگام ‍‍‍‍پیاده سازی یک حمله نیاز داشته باشید که default gateway رو بدست بیارید وجهت اتوماتیک سازی کارها نیاز به ورودی کاربر پیدا نکنید. مثلا برای حمله ARP بطور خودکار gateway آی پی خود را در شبکه بدست بیاورید و حمله را علیه آن انجام دهید و یا حالت های دیگر.

 

در فایل config.py کلاسی به نام conf وجود دارد.این کلاس شامل تنظیمات scapy است. براحتی میتونیم با دستور زیر این تنظیمات رو مشاهده کنیم:

root@4XMen:~# 
root@4XMen:~# python
Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41) 
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from scapy.all import *
WARNING: No route found for IPv6 destination :: (no default route?)
>>> print conf
ASN1_default_codec = <ASN1Codec BER[1]>
AS_resolver = <scapy.as_resolvers.AS_resolver_multi instance at 0x1954d40>
BTsocket   = <BluetoothL2CAPSocket: read/write packets on a connected L2CAP ...
L2listen   = <L2ListenSocket: read packets at layer 2 using Linux PF_PACKET ...
L2socket   = <L2Socket: read/write packets at layer 2 using Linux PF_PACKET ...
L3socket   = <L3PacketSocket: read/write packets at layer 3 using Linux PF_P...
auto_fragment = 1
checkIPID  = 0
checkIPaddr = 1
checkIPsrc = 1
check_TCPerror_seqack = 0
color_theme = <DefaultTheme>
commands   = arpcachepoison : Poison target's cache with (your MAC,victim's ...
debug_dissector = 0
debug_match = 0
default_l2 = <class 'scapy.packet.Raw'>
ethertypes = </etc/ethertypes/ >
except_filter = ''
extensions_paths = '.'
histfile   = '/root/.scapy_history'
iface      = 'ppp0'
iface6     = 'lo'
interactive = False
ipv6_enabled = True
l2types    = 0x1 <- Dot3 (802.3) 0x1 <-> Ether (Ethernet) 0xc -> IP (IP) 0x1...
l3types    = 0x3 -> IP (IP) 0x800 <-> IP (IP) 0x806 <-> ARP (ARP) 0x86dd <->...
layers     = Packet : None NoPayload : None Raw : Raw Padding : Padding ASN1...
load_layers = ['l2', 'inet', 'dhcp', 'dns', 'dot11', 'gprs', 'hsrp', 'inet6'...
logLevel   = 30
manufdb    = </usr/share/wireshark/manuf/ >
mib        = <MIB/ >
neighbor   = Dot3 -> SNAP Ether -> LLC Ether -> ARP Dot3 -> IP Ether -> Dot1...
netcache   = arp_cache: 0 valid items. Timeout=120s in6_neighbor: 0 valid it...
noenum     = <Resolve []>
padding    = 1
prog       = display = 'display' dot = 'dot' hexedit = 'hexer' pdfreader = '...
promisc    = 1
prompt     = '>>> '
protocols  = </etc/protocols/ pim ip ax_25 esp tcp ah mpls_in_ip ipv6_opts x...
raw_layer  = <class 'scapy.packet.Raw'>
resolve    = <Resolve []>
route      = Network Netmask Gateway Iface Output IP 127.0.0.0 255.0.0.0 0.0...
route6     = Destination Next Hop iface src candidates ::1/128 :: lo ::1
services_tcp = </etc/services-tcp/ kpop noclog svn cmip_man z3950 rootd gds_...
services_udp = </etc/services-udp/ noclog cmip_man z3950 rootd gds_db afs3_r...
session    = ''
sniff_promisc = 1
stats_classic_protocols = [<class 'scapy.layers.inet.TCP'>, <class 'scapy.la...
stats_dot11_protocols = [<class 'scapy.layers.inet.TCP'>, <class 'scapy.laye...
stealth    = 'not implemented'
temp_files = []
teredoPrefix = '2001::'
teredoServerPort = 3544
use_dnet   = False
use_pcap   = False
verb       = 2
version    = '2.0.1'
warning_threshold = 5
wepkey     = ''
>>>

خوب در این کلاس شی به نام route موجود است که این شی با استفاده از فایل route.py که متخص کار با جدول مسیریابی در سیستم نوشته شده است مقداردهی خواهد شد. حال با پایتون سعی میکنیم تا این شی از کلاس را پرینت کنیم و محتوا را مشاهده کنیم. پس مانند زیر دستور ها را می نویسیم :

>>> 
>>> print conf.route
Network         Netmask         Gateway         Iface           Output IP
۱۲۷.۰.۰.۰       ۲۵۵.۰.۰.۰       ۰.۰.۰.۰         lo              127.0.0.1      
۰.۰.۰.۰         ۰.۰.۰.۰         ۱۰.۶۴.۶۴.۶۴     ppp0            10.5.113.240   
۱۰.۶۴.۶۴.۶۴     ۲۵۵.۲۵۵.۲۵۵.۲۵۵ ۰.۰.۰.۰         ppp0            10.5.113.240   
۱۹۲.۱۶۸.۱۰.۰    ۲۵۵.۲۵۵.۲۵۵.۰   ۰.۰.۰.۰         eth0            0.0.0.0        
۱۹۲.۱۶۸.۵۰.۰    ۲۵۵.۲۵۵.۲۵۵.۰   ۰.۰.۰.۰         eth0            0.0.0.0        

>>>

خوب میبینیم که  routing table درون سیستممان را بطور کامل برایمان نشان داد که default gateway نیز شامل آنهاست و چیزی که میخواهیم بدست آوریم. parse نمودن بدین صورت زیاد جالب نخواهد بود بنابراین بازهم از conf.route به فیلد دیگری مراجع میکنیم تا اطلاعات را بصورت بهتری متناسب با کاری که میخواهیم انجام دهیم به نمایش درآید.بدین صورت:

>>> 
>>> print conf.route.routes
[(2130706432L, 4278190080L, '0.0.0.0', 'lo', '127.0.0.1'), (0L, 0L, '10.64.64.64', 'ppp0', '10.5.113.240'), (171982912L, 4294967295L, '0.0.0.0', 'ppp0', '10.5.113.240'), (3232238080L, 4294967040L, '0.0.0.0', 'eth0', '0.0.0.0'), (3232248320L, 4294967040L, '0.0.0.0', 'eth0', '0.0.0.0')]
>>>

براحتی میتوان اطلاعات شبکه هایمان را داشته باشیم و براساس هرفیلدی که لازم است داده ها را فیلتر نماییم. خوب جهت راحتی کار  ما تابعی مینویسیم که پارامتر ورودی IP موردنظرمان و خروجی نیز gateway همان IP ورودی خواهد بود:

 

#!/usr/bin/env python

'''
Author : AHA @ XMen

Example:
	get_gateway('10.10.10.20')
'''

import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
from scapy.all import *

def get_gateway(ip_param):
	gateways=''
	for route_line in conf.route.routes:
		if (route_line[4]==ip_param) and (route_line[2]!='0.0.0.0'):
			gateways=route_line[2]
	return gateways

 


انتشار

در

,

توسط

برچسب‌ها:

نظرات

2 پاسخ به “بدست آوردن Gateway در Python با scapy”
  1. موسوی نیم‌رخ
    موسوی

    با سلام
    خواهشمند است در صورت داشتن معنی خط به خط (بدست آوردن Gateway در Python با scapy) منظور برنامه ای که نوشته شده برای اینجانب ارسال نمایید یا راهنمایی کنید از چه طریقی میتونم خط به خط معنی کنم ممنون

    1. AHA نیم‌رخ
      AHA

      سلام. مطلب فوق بسیار،بسیار ساده و روان است. بهترین راهنمایی و درک کدها اجرای خط به خط و مشاهده خروجی است.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *