Sample Python method for modifying IP to send requests based on the scapy implementation

  • 2020-06-12 09:33:56
  • OfStack

This article illustrates how Python can modify IP send requests based on scapy implementation. To share for your reference, specific as follows:

Today, my colleagues want to test the page statistics function of WAF, so we need to simulate multiple IP sending requests to multiple domains, that is, we need to modify the source IP address. This is a little bit of a hassle to use the socket library,

You need to use raw socket, which is pretty cumbersome. Luckily, we have scapy. It's easy.

DOMAIN is the domain name library That I randomly constructed, and SOURCE is also the source IP address that I randomly constructed.


#!/usr/bin/env python
#-*-encoding:UTF-8-*-
from scapy.all import *
from threading import Thread
from Queue import Queue
import random
import string
USER_AGENTS = ( # items used for picking random HTTP User-Agent header value
  "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_7_0; en-US) AppleWebKit/534.21 (KHTML, like Gecko) Chrome/11.0.678.0 Safari/534.21",
  "Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)",
  "Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:0.9.2) Gecko/20020508 Netscape6/6.1",
  "Mozilla/5.0 (X11;U; Linux i686; en-GB; rv:1.9.1) Gecko/20090624 Ubuntu/9.04 (jaunty) Firefox/3.5",
  "Opera/9.80 (X11; U; Linux i686; en-US; rv:1.9.2.3) Presto/2.2.15 Version/10.10"
)
TOP_DOMAIN = ('com','org','net','gov','edu','mil','info','name','biz')
DOMAIN = ["www.%s.%s" %(
    '.'.join(''.join(random.sample(string.ascii_lowercase, random.randint(2,6))) for x in range(random.randint(1,2))),
    random.choice(TOP_DOMAIN))
    for _ in range(100)
]
SOURCE = ['.'.join((str(random.randint(1,254)) for _ in range(4))) for _ in range(100)]
class Scan(Thread):
  HTTPSTR = 'GET / HTTP/1.0\r\nHost: %s\r\nUser-Agent: %s\r\n\r\n'
  def run(self):
    for _ in xrange(100):
      domain = random.choice(DOMAIN)
      http = self.HTTPSTR % (domain,random.choice(USER_AGENTS))
      try:
        request = IP(src=random.choice(SOURCE),dst=domain) / TCP(dport=80) / http
        #request = IP(dst=domain) / TCP(dport=80) / http
        send(request)
      except:
        pass
task = []
for x in range(10):
  t = Scan()
  task.append(t)
for t in task:
  t.start()
for t in task:
  t.join()
print 'all task done!'

But this leads to a problem. Since our domain name is randomly constructed, the sending request must look for DNS first, and the parsing is likely to fail. Here are two ways to solve this problem:

1. Add all domain names to the hosts local file. IP can be the server address

2. As a result of hosts file does not support wildcards said, so you can use DNS agent, or write their own small tools, think how to resolve how to parse, here are a https: / / github com/phuslu dnsproxy blob/master/dnsproxy py

For more information about Python, please refer to Python Socket Programming Skills Summary, Python Data Structure and Algorithm Tutorial, Python Function Using Skills Summary, Python String Manipulation Skills Summary, Python Introduction and Advanced Classic Tutorial and Python File and Directory Operation Skills Summary.

I hope this article has been helpful for Python programming.


Related articles: