From 469235194d7b395b45c502ca6bad011649e35bc3 Mon Sep 17 00:00:00 2001 From: DAProgs Date: Tue, 6 Oct 2026 08:04:43 -0400 Subject: [PATCH] 2601.01 - Adding stealth mode --- .../__pycache__/__init__.cpython-312.pyc | Bin 272 -> 269 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 332 -> 328 bytes .../__pycache__/admin.cpython-312.pyc | Bin 33882 -> 44449 bytes portspoof_py/__pycache__/cli.cpython-312.pyc | Bin 11945 -> 12840 bytes .../__pycache__/config.cpython-312.pyc | Bin 3562 -> 3558 bytes portspoof_py/__pycache__/geo.cpython-312.pyc | Bin 0 -> 2129 bytes .../__pycache__/iptables.cpython-312.pyc | Bin 4201 -> 4173 bytes .../__pycache__/logger.cpython-312.pyc | Bin 4832 -> 4828 bytes .../__pycache__/notifier.cpython-312.pyc | Bin 9152 -> 9148 bytes .../__pycache__/revregex.cpython-312.pyc | Bin 12612 -> 12608 bytes .../__pycache__/server.cpython-312.pyc | Bin 5171 -> 5560 bytes .../__pycache__/settings.cpython-312.pyc | Bin 0 -> 607 bytes .../__pycache__/stats.cpython-312.pyc | Bin 7287 -> 7283 bytes portspoof_py/cli.py | 8 +++-- portspoof_py/server.py | 28 +++++++++++------- 15 files changed, 24 insertions(+), 12 deletions(-) create mode 100644 portspoof_py/__pycache__/geo.cpython-312.pyc create mode 100644 portspoof_py/__pycache__/settings.cpython-312.pyc diff --git a/portspoof_py/__pycache__/__init__.cpython-312.pyc b/portspoof_py/__pycache__/__init__.cpython-312.pyc index b43556ba89b300a12aded004d96f60fac1bd6363..f5dfe3140a9c9a72653e90d4d9f9cd08fc1c8e58 100644 GIT binary patch delta 62 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

!6Hl)^GmfID1TW(N3ALL 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 aUbh^1<{l-H&^lWhp^~%e0z>C~z<&cVf=(;| delta 2906 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 E04+L5ZU6uP delta 389 zcmX@B@KS;IG%qg~0}!ZQTa&qXBX0t;sFi+3er~FMN@77#etNNfa!z7tO6ul1=C6$U zlYk1RGn6obG=RWr2*ps#l+IAgoWhvSSi@MsSj@!8kj_xWz%Y3hYlZ_;l|@i$Noi4@ zLP}~%X+dg=LVi(7Y7vmm$t*6hQiwJ((oxV#ttcrb(>Lnm^f+ z&EHT7$dCu(;!q&b!0<#scrt5)%MD)s2Dcl00v#a}VlIiQF9^EGtFgj+h3!RNi_M$Z z_?g8)+KPmM#4YCHlA@LDMG_zZ<;gcVof)k*%Ww%ZN2-EE)Ifwfkf>tPbt%#S@iak% z7KqRW5jr437f85iG8XZHIC>yLA4C{{2tyEI1SI^5j6qD($sN4Pj5eFs@Fp=bnoQ>B XSK$V`#tI~9Gue(`meFZ)4F5*}3M^eh diff --git a/portspoof_py/__pycache__/logger.cpython-312.pyc b/portspoof_py/__pycache__/logger.cpython-312.pyc index 672aa9797310fc38f5995f0b1d074658c0adbf1e..ea745df6ec89f12e404e74eaba166bca32441d49 100644 GIT binary patch delta 44 ycmaE$dPkM#G%qg~0}xDna3pIZPX@D~iGD_YZmNDtVnI=Uda-_D=H^c3aDD(pbq=Ed delta 48 zcmcbk`aqTEG%qg~0}vQ>uFc%Ylff)%p`VeTo2s9ZSWuLoUaX&-lUSOPy1A7(oF4#b C<_~=U diff --git a/portspoof_py/__pycache__/notifier.cpython-312.pyc b/portspoof_py/__pycache__/notifier.cpython-312.pyc index 5c5d6ec75ab0cf03462879f51031a1578b54b3ca..995574393dd11d6011ccb4da8ee5497a4aadb52e 100644 GIT binary patch delta 44 ycmX@$zQ>*CG%qg~0}xDna3pIZ&o>r9GyRPG+*JLP#Db#y^kV(Q%+2DgE9C%D@DC{f delta 48 zcmdnve!!jQG%qg~0}#xcur_le&o>rPEB%c8+*JLP#Db#y^kV(woW#!AG%qg~0}zBBU6Z+y$AwSSNZ CG7yLW diff --git a/portspoof_py/__pycache__/server.cpython-312.pyc b/portspoof_py/__pycache__/server.cpython-312.pyc index 93397d6f958c2e9b3ec9375dbd0c6dd8d9a1e567..60f9dae16b88cdd6a8e13cbad6189dd75e00e78a 100644 GIT binary patch delta 2497 zcmaKtT})iZ6@X`U@Bi=qu&}V0y@0V<@WygU3^t8xAS{-X+OeI)&Q|WSW-fTivP8%R*le8L+Zsn~njaG40tARb zTv{BG;*!IBS{_p33Sk&mkr3CAXu1cvl9!ztNhW9Nl|<3cAbFCBdqjYONSVD^F`=4p zaQBXBiI8RrNH-t$Q%wf+Ajb zM_@T_U?OagjPm0%%zI4*A@|Ixz~^i;nYJ(X@jJ5vmGG~~xA`e9GEI=jAvO{f@&aP$ z;z`ZYdR!V8Z8rg@B(*Q#asJSWA+)jVUJ zCLQJW_S{I!iyr_a)Vq- zKy)E|fUn0_I1$TyszS_5c{#7%V76RBFa}z|Z-(%%`A5);&kILgn*hHrgpUUe<3ci% zF|C&yGue!}&vp@hjx1$NX**=B)7Rx*{ruZw4!HH%)TRYgUJifSr$QBgxhmdQTeWnb@?O7b6y zcgGCdf`*|V(b(7_JzN- z9s79XvkS{FoGQAZ_YC~b?N+to2}xzW>w5WPU*%kMHu@p=k#K1-Po;awsPB=Ohi=%z2@e^TvPkt0C9$WRf9Q8n4nWG~ZpxK(Y=OC$&DmCfUZ|9_ zv%?AVT{C0%3HX{)w&z1~p;KTAPBBy56#puKU=B=!X*kVI^V3W}i{PX%F5vgI8dqMx zn@TfDNMSWZWV^cekYv**rWoHrWb3(zXS z(dR;7=k?QI$k9Y)7?)|WDsWhja6hH$I($M8g%{7=9$l$E`K9o>)j+f--q;}L0V0fb zl(eh>p46w|D_He3!U}xQ6NM>^JjXgaelnc3?A&lR+kd_k@y1XVnTL(OEXf9ab}F06 z8GY$&&P2v&%D$K#v5lOWK_tr?C}}704Nn+G@#mh}i6$~rff-Gv?1=o_F18jxSK)+o z2c?~z9ixM|oN2vlS_L+Vkd@2P1MKZJj9!CEV=JH~Yb2A{va`++gVW^8{e_7CIzj#K zpaj`dun4Hc7rbvM>%8_@P?xn+UkIo1pS>-7EvIo$i&ePj4NnY`fm6+09{4BN*}~lF z;0fM23_D-q?zFopA1Ui>ci;8F&Q|WOpP^hK6aC#f*m;P#Tkoa(5~Q*f(%wT3w{u-8 ze-FYgM!DzWDT~x|1jZskl9CcA+m}dKQ9#n1wVy1(s-?n1M1ix%hRLB?Zv01IO_g&% z^ujHg;4Gb5xKkOMq}M0DJ*_mUSwE&qwwp$Tb0QxD=jxr~`j7BKa*ZQt^N7_)%*ay! zxiG|s{kz0}f~qIRmn=EaTq#}8Wyn_No z(Lo7lzM|})0`!Wa>Yzroj?*F?SOCiPe1+j@~DK)lQTD=jn8 tB2QZakhP*nY0Ez)1$cvV>a1E+X-lJ%>6AQlF6y-CBU63nC*&N%{{XW>S3Up$ delta 2268 zcmZvdeQXrR6~Je1zxQ_cK78jhwy_tCKh8EeQ=kxH66ef0X)ul=(H8s%$JMhw&av;T zx#h#{TDB-HAVmT)sxVEXRH{@pq8~&=3d&!JgHfuglBrwaToaX~YE=H}B}NU3nx=2g z9QGd_-M;sGGxOf;?96+2qw9J{`yWhGN6(VQ`9&YJUxci}G+J;sh$Qq7bgT8e~mZye(1--mxiP zJjM>JH$f)w58+uk#=a0c zvGlSOV~#FS5vrpwtHmc-eil=&-=f5hhj$t%~cA=Mkz&=%O;{dy%_OY+j#vaYKzn9799lH0P z4HJ*^Px{I1FX<-G@kq(aI&RuI<>VWbkP9AUe_q!V@XLL%jC(p zL!SU^3p~YNz#;z=J(xvhi@l+fnY(82!jbbw<_;{GowEZUE7pgqxokx*j$S-8_rlz% zxv^jA*Y;jZEL*WTd9L_#-<i7Y+MED_VbH;{3$V23{Mw zGW6>`Z+?HNF}Y;*-%#f6LYex|LgT zALlO2xm)0z5Wu%29xD`G8sP_{7u~{S+BxCm-I4WmjAu(Fc~8SRokeHyS#dwY=rTHo z&iU~r%>0U0Nv_R4n9eTo{B`HG)Ef)Fqjvlpb_}TVq;^_2vKD|1NejA2|;3>WZ z;>$|%{5yiBC-2KB(r~Ay{WiNE-p}-!?K2x?OMXzU#gYwow)p{M1JD-;WJP?&=|9CB zg!xfC`4s*wPHq-|w+HCmI8JVn-|ZAQZ;d27g?WsVZSuTNT=cN7YMO%lZ-nyy=8}-hyHK@uM%oB3Ba~l)l9b|ixAJXXM>NIzdByos?VTu) z28jf9CUHaYaTr@KOVsD>_((xrl}qG z;bo%+3dL>1E(_ee`^c2IS(cF=EGrdMIcgQukrgicD`+5DUok6q5I5kCWi3z^K;H!| tfrbeFnv2`dZ!Ig_Qjy;(Yn=4fN)V0)3e{aUFPUYNTNXsT9{{TC_K1etsAq3LVEE3Iul#?i^qCgi>Bn_h3#&XVccZ+uI!}bP_Dg{Wi zRQU}ke}j$^3Rnp#5*6K{E09t#-rb9Yi}8CN`_1#%Uj~CMpz-nI^UH?};8!4<(P_c@ z5rH#Mkb+{0=d9oWd(Yb=X|(K&x^E8-OD~UeOl+xrR$$`L`%KSV z;^xw#N{-RLM%0O)hnzh@n@Ft^sftV|nf7R>a)P_RgY1Y^*Oc^fl1t|%ZJ~OKTC#pX z;0zE_MrQd7vYSR2V@L5l%BU#q)+`Pz7_9owTSK!(V)cY-U@n(}476*vo?flVH%Fsh z)fYm`0)?oygeZ(E^MJ1l@v4-0ld)aWt2)!%NMG#;A+I%WS+b*1Lrfeu^({w6Yj0L Uz_ov3^E=ZmNDtVnI=Uda-_D=H^PKf06)E!ViT2 delta 48 zcmext@!f*wG%qg~0}zNWU6;9$CxS`TTt6c}H&s6+v7jhFy;wgvC$Tgob#p1xKS=<1 CV-R5g diff --git a/portspoof_py/cli.py b/portspoof_py/cli.py index f782cb8..25de4c0 100644 --- a/portspoof_py/cli.py +++ b/portspoof_py/cli.py @@ -42,7 +42,10 @@ def _parse_args(argv=None): p.add_argument('--no-iptables', action='store_true', help='Skip iptables rule setup/teardown') p.add_argument('-v', '--verbose', action='store_true', - help='Print each connection to stdout') + help='Print each connection to stdout') + p.add_argument('--stealth', action='store_true', + help='Send no data on connections — close immediately, ' + 'still logging each connection') p.add_argument('--admin-port', type=int, default=None, metavar='PORT', help='Enable web admin interface on this port (default: disabled)') p.add_argument('--admin-host', default='127.0.0.1', metavar='HOST', @@ -177,7 +180,8 @@ def main(argv=None) -> int: try: bind_ip: Optional[str] = args.bind_ip or None tasks.append(asyncio.create_task( - run_server(cfg, log, bind_ip, args.port, args.verbose, stop_event, settings) + run_server(cfg, log, bind_ip, args.port, args.verbose, stop_event, settings, + stealth=args.stealth) )) if args.admin_port: tasks.append(asyncio.create_task( diff --git a/portspoof_py/server.py b/portspoof_py/server.py index 0f0e280..3179318 100644 --- a/portspoof_py/server.py +++ b/portspoof_py/server.py @@ -38,6 +38,7 @@ async def _handle( log: Logger, verbose: bool, settings: Settings, + stealth: bool = False, ) -> None: sock = writer.get_extra_info('socket') peername = writer.get_extra_info('peername') or ('?.?.?.?', 0) @@ -49,19 +50,23 @@ async def _handle( sockname = writer.get_extra_info('sockname') or ('', 0) original_port = sockname[1] - banner = cfg.get_banner(original_port) + banner = b'' if stealth else cfg.get_banner(original_port) if verbose: - print( - f"[conn] {src_ip}:{src_port} → port {original_port}" - f" banner={banner[:32].hex()}{'…' if len(banner) > 32 else ''}" - ) + if stealth: + print(f"[conn] {src_ip}:{src_port} → port {original_port} banner=(none, stealth)") + else: + print( + f"[conn] {src_ip}:{src_port} → port {original_port}" + f" banner={banner[:32].hex()}{'…' if len(banner) > 32 else ''}" + ) try: - await asyncio.sleep(random.uniform(settings.delay_min, settings.delay_max)) - if banner: - writer.write(banner) - await writer.drain() + if not stealth: + await asyncio.sleep(random.uniform(settings.delay_min, settings.delay_max)) + if banner: + writer.write(banner) + await writer.drain() except (ConnectionResetError, BrokenPipeError): pass finally: @@ -82,11 +87,12 @@ async def run_server( verbose: bool, stop_event: asyncio.Event, settings: Settings, + stealth: bool = False, ) -> None: """Start the asyncio TCP server and run until stop_event is set.""" def handler(r, w): - asyncio.create_task(_handle(r, w, cfg, log, verbose, settings)) + asyncio.create_task(_handle(r, w, cfg, log, verbose, settings, stealth)) server = await asyncio.start_server( handler, @@ -98,6 +104,8 @@ async def run_server( addrs = ', '.join(str(s.getsockname()) for s in server.sockets) print(f"[portspoof] listening on {addrs}") + if stealth: + print("[portspoof] stealth mode: connections closed without sending data") async with server: await stop_event.wait()