aardwolf 0.2.7__cp39-cp39-linux_armv7l.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- aardwolf/__init__.py +10 -0
- aardwolf/_version.py +7 -0
- aardwolf/channels.py +77 -0
- aardwolf/commons/__init__.py +0 -0
- aardwolf/commons/cryptolayer.py +259 -0
- aardwolf/commons/factory.py +145 -0
- aardwolf/commons/iosettings.py +70 -0
- aardwolf/commons/params.py +56 -0
- aardwolf/commons/queuedata/__init__.py +19 -0
- aardwolf/commons/queuedata/beep.py +21 -0
- aardwolf/commons/queuedata/clipboard.py +57 -0
- aardwolf/commons/queuedata/constants.py +42 -0
- aardwolf/commons/queuedata/keyboard.py +19 -0
- aardwolf/commons/queuedata/mouse.py +31 -0
- aardwolf/commons/queuedata/video.py +65 -0
- aardwolf/commons/serverinfo.py +149 -0
- aardwolf/commons/target.py +139 -0
- aardwolf/commons/utils/__init__.py +0 -0
- aardwolf/commons/utils/ts2dt.py +17 -0
- aardwolf/connection.py +1304 -0
- aardwolf/examples/__init__.py +0 -0
- aardwolf/examples/scancommons/__init__.py +0 -0
- aardwolf/examples/scancommons/internal.py +23 -0
- aardwolf/examples/scancommons/targetgens.py +38 -0
- aardwolf/examples/scancommons/utils.py +11 -0
- aardwolf/examples/scanners/__init__.py +0 -0
- aardwolf/examples/scanners/__main__.py +117 -0
- aardwolf/examples/scanners/rdplogin.py +44 -0
- aardwolf/examples/scanners/rdpscaps.py +101 -0
- aardwolf/examples/scanners/rdpscreen.py +65 -0
- aardwolf/extensions/RDPECLIP/__init__.py +0 -0
- aardwolf/extensions/RDPECLIP/channel.py +299 -0
- aardwolf/extensions/RDPECLIP/protocol/__init__.py +115 -0
- aardwolf/extensions/RDPECLIP/protocol/clienttemporarydirectory.py +33 -0
- aardwolf/extensions/RDPECLIP/protocol/clipboardcapabilities.py +102 -0
- aardwolf/extensions/RDPECLIP/protocol/filecontentsrequest.py +67 -0
- aardwolf/extensions/RDPECLIP/protocol/filecontentsresponse.py +40 -0
- aardwolf/extensions/RDPECLIP/protocol/formatdatarequest.py +42 -0
- aardwolf/extensions/RDPECLIP/protocol/formatdataresponse.py +282 -0
- aardwolf/extensions/RDPECLIP/protocol/formatlist.py +206 -0
- aardwolf/extensions/RDPECLIP/protocol/lockclipboarddata.py +33 -0
- aardwolf/extensions/RDPECLIP/protocol/unlockclipboarddata.py +33 -0
- aardwolf/extensions/RDPEDYC/__init__.py +0 -0
- aardwolf/extensions/RDPEDYC/channel.py +130 -0
- aardwolf/extensions/RDPEDYC/protocol/__init__.py +77 -0
- aardwolf/extensions/RDPEDYC/protocol/caps.py +83 -0
- aardwolf/extensions/RDPEDYC/protocol/close.py +30 -0
- aardwolf/extensions/RDPEDYC/protocol/create.py +84 -0
- aardwolf/extensions/RDPEDYC/protocol/data.py +122 -0
- aardwolf/extensions/RDPEDYC/protocol/softsync.py +116 -0
- aardwolf/extensions/RDPEDYC/vchannels/__init__.py +80 -0
- aardwolf/extensions/RDPEDYC/vchannels/echo/__init__.py +18 -0
- aardwolf/extensions/RDPEDYC/vchannels/socksoverrdp/__init__.py +112 -0
- aardwolf/extensions/RDPEDYC/vchannels/test/__init__.py +22 -0
- aardwolf/extensions/__init__.py +0 -0
- aardwolf/keyboard/__init__.py +125 -0
- aardwolf/keyboard/layoutmanager.py +52 -0
- aardwolf/keyboard/layouts/__init__.py +0 -0
- aardwolf/keyboard/layouts/layout_00000401.py +1 -0
- aardwolf/keyboard/layouts/layout_00000402.py +1 -0
- aardwolf/keyboard/layouts/layout_00000404.py +1 -0
- aardwolf/keyboard/layouts/layout_00000405.py +1 -0
- aardwolf/keyboard/layouts/layout_00000406.py +1 -0
- aardwolf/keyboard/layouts/layout_00000407.py +1 -0
- aardwolf/keyboard/layouts/layout_00000408.py +1 -0
- aardwolf/keyboard/layouts/layout_00000409.py +1 -0
- aardwolf/keyboard/layouts/layout_0000040a.py +1 -0
- aardwolf/keyboard/layouts/layout_0000040b.py +1 -0
- aardwolf/keyboard/layouts/layout_0000040c.py +1 -0
- aardwolf/keyboard/layouts/layout_0000040d.py +1 -0
- aardwolf/keyboard/layouts/layout_0000040e.py +1 -0
- aardwolf/keyboard/layouts/layout_0000040f.py +1 -0
- aardwolf/keyboard/layouts/layout_00000410.py +1 -0
- aardwolf/keyboard/layouts/layout_00000411.py +1 -0
- aardwolf/keyboard/layouts/layout_00000412.py +1 -0
- aardwolf/keyboard/layouts/layout_00000413.py +1 -0
- aardwolf/keyboard/layouts/layout_00000414.py +1 -0
- aardwolf/keyboard/layouts/layout_00000415.py +1 -0
- aardwolf/keyboard/layouts/layout_00000416.py +1 -0
- aardwolf/keyboard/layouts/layout_00000418.py +1 -0
- aardwolf/keyboard/layouts/layout_00000419.py +1 -0
- aardwolf/keyboard/layouts/layout_0000041a.py +1 -0
- aardwolf/keyboard/layouts/layout_0000041b.py +1 -0
- aardwolf/keyboard/layouts/layout_0000041c.py +1 -0
- aardwolf/keyboard/layouts/layout_0000041d.py +1 -0
- aardwolf/keyboard/layouts/layout_0000041e.py +1 -0
- aardwolf/keyboard/layouts/layout_0000041f.py +1 -0
- aardwolf/keyboard/layouts/layout_00000420.py +1 -0
- aardwolf/keyboard/layouts/layout_00000422.py +1 -0
- aardwolf/keyboard/layouts/layout_00000423.py +1 -0
- aardwolf/keyboard/layouts/layout_00000424.py +1 -0
- aardwolf/keyboard/layouts/layout_00000425.py +1 -0
- aardwolf/keyboard/layouts/layout_00000426.py +1 -0
- aardwolf/keyboard/layouts/layout_00000427.py +1 -0
- aardwolf/keyboard/layouts/layout_00000428.py +1 -0
- aardwolf/keyboard/layouts/layout_00000429.py +1 -0
- aardwolf/keyboard/layouts/layout_0000042a.py +1 -0
- aardwolf/keyboard/layouts/layout_0000042b.py +1 -0
- aardwolf/keyboard/layouts/layout_0000042c.py +1 -0
- aardwolf/keyboard/layouts/layout_0000042e.py +1 -0
- aardwolf/keyboard/layouts/layout_0000042f.py +1 -0
- aardwolf/keyboard/layouts/layout_00000432.py +1 -0
- aardwolf/keyboard/layouts/layout_00000437.py +1 -0
- aardwolf/keyboard/layouts/layout_00000438.py +1 -0
- aardwolf/keyboard/layouts/layout_00000439.py +1 -0
- aardwolf/keyboard/layouts/layout_0000043a.py +1 -0
- aardwolf/keyboard/layouts/layout_0000043b.py +1 -0
- aardwolf/keyboard/layouts/layout_0000043f.py +1 -0
- aardwolf/keyboard/layouts/layout_00000440.py +1 -0
- aardwolf/keyboard/layouts/layout_00000442.py +1 -0
- aardwolf/keyboard/layouts/layout_00000444.py +1 -0
- aardwolf/keyboard/layouts/layout_00000445.py +1 -0
- aardwolf/keyboard/layouts/layout_00000446.py +1 -0
- aardwolf/keyboard/layouts/layout_00000447.py +1 -0
- aardwolf/keyboard/layouts/layout_00000448.py +1 -0
- aardwolf/keyboard/layouts/layout_00000449.py +1 -0
- aardwolf/keyboard/layouts/layout_0000044a.py +1 -0
- aardwolf/keyboard/layouts/layout_0000044b.py +1 -0
- aardwolf/keyboard/layouts/layout_0000044c.py +1 -0
- aardwolf/keyboard/layouts/layout_0000044d.py +1 -0
- aardwolf/keyboard/layouts/layout_0000044e.py +1 -0
- aardwolf/keyboard/layouts/layout_00000450.py +1 -0
- aardwolf/keyboard/layouts/layout_00000451.py +1 -0
- aardwolf/keyboard/layouts/layout_00000452.py +1 -0
- aardwolf/keyboard/layouts/layout_00000453.py +1 -0
- aardwolf/keyboard/layouts/layout_00000454.py +1 -0
- aardwolf/keyboard/layouts/layout_0000045a.py +1 -0
- aardwolf/keyboard/layouts/layout_0000045b.py +1 -0
- aardwolf/keyboard/layouts/layout_0000045c.py +1 -0
- aardwolf/keyboard/layouts/layout_00000461.py +1 -0
- aardwolf/keyboard/layouts/layout_00000463.py +1 -0
- aardwolf/keyboard/layouts/layout_00000465.py +1 -0
- aardwolf/keyboard/layouts/layout_00000468.py +1 -0
- aardwolf/keyboard/layouts/layout_0000046a.py +1 -0
- aardwolf/keyboard/layouts/layout_0000046c.py +1 -0
- aardwolf/keyboard/layouts/layout_0000046d.py +1 -0
- aardwolf/keyboard/layouts/layout_0000046e.py +1 -0
- aardwolf/keyboard/layouts/layout_0000046f.py +1 -0
- aardwolf/keyboard/layouts/layout_00000470.py +1 -0
- aardwolf/keyboard/layouts/layout_00000474.py +1 -0
- aardwolf/keyboard/layouts/layout_00000475.py +1 -0
- aardwolf/keyboard/layouts/layout_00000480.py +1 -0
- aardwolf/keyboard/layouts/layout_00000481.py +1 -0
- aardwolf/keyboard/layouts/layout_00000485.py +1 -0
- aardwolf/keyboard/layouts/layout_00000488.py +1 -0
- aardwolf/keyboard/layouts/layout_00000492.py +1 -0
- aardwolf/keyboard/layouts/layout_00000804.py +1 -0
- aardwolf/keyboard/layouts/layout_00000807.py +1 -0
- aardwolf/keyboard/layouts/layout_00000809.py +1 -0
- aardwolf/keyboard/layouts/layout_0000080a.py +1 -0
- aardwolf/keyboard/layouts/layout_0000080c.py +1 -0
- aardwolf/keyboard/layouts/layout_00000813.py +1 -0
- aardwolf/keyboard/layouts/layout_00000816.py +1 -0
- aardwolf/keyboard/layouts/layout_0000081a.py +1 -0
- aardwolf/keyboard/layouts/layout_0000082c.py +1 -0
- aardwolf/keyboard/layouts/layout_0000083b.py +1 -0
- aardwolf/keyboard/layouts/layout_00000843.py +1 -0
- aardwolf/keyboard/layouts/layout_00000850.py +1 -0
- aardwolf/keyboard/layouts/layout_0000085d.py +1 -0
- aardwolf/keyboard/layouts/layout_0000085f.py +1 -0
- aardwolf/keyboard/layouts/layout_00000c04.py +1 -0
- aardwolf/keyboard/layouts/layout_00000c0c.py +1 -0
- aardwolf/keyboard/layouts/layout_00000c1a.py +1 -0
- aardwolf/keyboard/layouts/layout_00000c51.py +1 -0
- aardwolf/keyboard/layouts/layout_00001004.py +1 -0
- aardwolf/keyboard/layouts/layout_00001009.py +1 -0
- aardwolf/keyboard/layouts/layout_0000100c.py +1 -0
- aardwolf/keyboard/layouts/layout_0000105f.py +1 -0
- aardwolf/keyboard/layouts/layout_00001404.py +1 -0
- aardwolf/keyboard/layouts/layout_00001409.py +1 -0
- aardwolf/keyboard/layouts/layout_00001809.py +1 -0
- aardwolf/keyboard/layouts/layout_0000201a.py +1 -0
- aardwolf/keyboard/layouts/layout_00004009.py +1 -0
- aardwolf/keyboard/layouts/layout_00010401.py +1 -0
- aardwolf/keyboard/layouts/layout_00010402.py +1 -0
- aardwolf/keyboard/layouts/layout_00010405.py +1 -0
- aardwolf/keyboard/layouts/layout_00010407.py +1 -0
- aardwolf/keyboard/layouts/layout_00010408.py +1 -0
- aardwolf/keyboard/layouts/layout_00010409.py +1 -0
- aardwolf/keyboard/layouts/layout_0001040a.py +1 -0
- aardwolf/keyboard/layouts/layout_0001040e.py +1 -0
- aardwolf/keyboard/layouts/layout_00010410.py +1 -0
- aardwolf/keyboard/layouts/layout_00010415.py +1 -0
- aardwolf/keyboard/layouts/layout_00010416.py +1 -0
- aardwolf/keyboard/layouts/layout_00010418.py +1 -0
- aardwolf/keyboard/layouts/layout_00010419.py +1 -0
- aardwolf/keyboard/layouts/layout_0001041b.py +1 -0
- aardwolf/keyboard/layouts/layout_0001041e.py +1 -0
- aardwolf/keyboard/layouts/layout_0001041f.py +1 -0
- aardwolf/keyboard/layouts/layout_00010426.py +1 -0
- aardwolf/keyboard/layouts/layout_00010427.py +1 -0
- aardwolf/keyboard/layouts/layout_0001042b.py +1 -0
- aardwolf/keyboard/layouts/layout_0001042c.py +1 -0
- aardwolf/keyboard/layouts/layout_0001042e.py +1 -0
- aardwolf/keyboard/layouts/layout_0001042f.py +1 -0
- aardwolf/keyboard/layouts/layout_00010437.py +1 -0
- aardwolf/keyboard/layouts/layout_00010439.py +1 -0
- aardwolf/keyboard/layouts/layout_0001043a.py +1 -0
- aardwolf/keyboard/layouts/layout_0001043b.py +1 -0
- aardwolf/keyboard/layouts/layout_00010444.py +1 -0
- aardwolf/keyboard/layouts/layout_00010445.py +1 -0
- aardwolf/keyboard/layouts/layout_00010451.py +1 -0
- aardwolf/keyboard/layouts/layout_00010453.py +1 -0
- aardwolf/keyboard/layouts/layout_0001045a.py +1 -0
- aardwolf/keyboard/layouts/layout_0001045b.py +1 -0
- aardwolf/keyboard/layouts/layout_0001045c.py +1 -0
- aardwolf/keyboard/layouts/layout_0001045d.py +1 -0
- aardwolf/keyboard/layouts/layout_00010465.py +1 -0
- aardwolf/keyboard/layouts/layout_00010480.py +1 -0
- aardwolf/keyboard/layouts/layout_0001080c.py +1 -0
- aardwolf/keyboard/layouts/layout_0001083b.py +1 -0
- aardwolf/keyboard/layouts/layout_00010850.py +1 -0
- aardwolf/keyboard/layouts/layout_00010c00.py +1 -0
- aardwolf/keyboard/layouts/layout_00011009.py +1 -0
- aardwolf/keyboard/layouts/layout_0001105f.py +1 -0
- aardwolf/keyboard/layouts/layout_00011809.py +1 -0
- aardwolf/keyboard/layouts/layout_00020401.py +1 -0
- aardwolf/keyboard/layouts/layout_00020402.py +1 -0
- aardwolf/keyboard/layouts/layout_00020405.py +1 -0
- aardwolf/keyboard/layouts/layout_00020408.py +1 -0
- aardwolf/keyboard/layouts/layout_00020409.py +1 -0
- aardwolf/keyboard/layouts/layout_0002040d.py +1 -0
- aardwolf/keyboard/layouts/layout_00020418.py +1 -0
- aardwolf/keyboard/layouts/layout_00020419.py +1 -0
- aardwolf/keyboard/layouts/layout_0002041e.py +1 -0
- aardwolf/keyboard/layouts/layout_00020422.py +1 -0
- aardwolf/keyboard/layouts/layout_00020426.py +1 -0
- aardwolf/keyboard/layouts/layout_00020427.py +1 -0
- aardwolf/keyboard/layouts/layout_0002042b.py +1 -0
- aardwolf/keyboard/layouts/layout_0002042e.py +1 -0
- aardwolf/keyboard/layouts/layout_00020437.py +1 -0
- aardwolf/keyboard/layouts/layout_00020445.py +1 -0
- aardwolf/keyboard/layouts/layout_00020449.py +1 -0
- aardwolf/keyboard/layouts/layout_0002083b.py +1 -0
- aardwolf/keyboard/layouts/layout_00020c00.py +1 -0
- aardwolf/keyboard/layouts/layout_00030402.py +1 -0
- aardwolf/keyboard/layouts/layout_00030408.py +1 -0
- aardwolf/keyboard/layouts/layout_00030409.py +1 -0
- aardwolf/keyboard/layouts/layout_0003041e.py +1 -0
- aardwolf/keyboard/layouts/layout_0003042b.py +1 -0
- aardwolf/keyboard/layouts/layout_00030437.py +1 -0
- aardwolf/keyboard/layouts/layout_00030c00.py +1 -0
- aardwolf/keyboard/layouts/layout_00040402.py +1 -0
- aardwolf/keyboard/layouts/layout_00040408.py +1 -0
- aardwolf/keyboard/layouts/layout_00040409.py +1 -0
- aardwolf/keyboard/layouts/layout_00040437.py +1 -0
- aardwolf/keyboard/layouts/layout_00040c00.py +1 -0
- aardwolf/keyboard/layouts/layout_00050408.py +1 -0
- aardwolf/keyboard/layouts/layout_00050409.py +1 -0
- aardwolf/keyboard/layouts/layout_00050429.py +1 -0
- aardwolf/keyboard/layouts/layout_00060408.py +1 -0
- aardwolf/keyboard/layouts/layout_00070c00.py +1 -0
- aardwolf/keyboard/layouts/layout_00080c00.py +1 -0
- aardwolf/keyboard/layouts/layout_00090c00.py +1 -0
- aardwolf/keyboard/layouts/layout_000a0c00.py +1 -0
- aardwolf/keyboard/layouts/layout_000b0c00.py +1 -0
- aardwolf/keyboard/layouts/layout_000c0c00.py +1 -0
- aardwolf/keyboard/layouts/layout_000d0c00.py +1 -0
- aardwolf/keyboard/layouts/layout_000e0c00.py +1 -0
- aardwolf/keyboard/layouts/layout_000f0c00.py +1 -0
- aardwolf/keyboard/layouts/layout_00100c00.py +1 -0
- aardwolf/keyboard/layouts/layout_00110c00.py +1 -0
- aardwolf/keyboard/layouts/layout_00120c00.py +1 -0
- aardwolf/keyboard/layouts/layout_00130c00.py +1 -0
- aardwolf/keyboard/layouts/layout_00140c00.py +1 -0
- aardwolf/keyboard/layouts/layout_00150c00.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDA1.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDA2.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDA3.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDADLM.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDAL.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDARME.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDARMW.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDAZE.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDAZEL.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDAZST.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDBASH.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDBE.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDBENE.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDBGPH.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDBGPH1.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDBLR.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDBR.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDBU.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDBUG.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDBULG.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDCA.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDCAN.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDCHER.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDCHERP.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDCR.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDCZ.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDCZ1.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDCZ2.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDDA.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDDIV1.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDDIV2.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDDV.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDDZO.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDES.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDEST.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDFA.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDFC.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDFI.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDFO.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDFR.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDFTHRK.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDGAE.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDGEO.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDGKL.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDGN.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDGR.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDGR1.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDGRLND.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDGTHC.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDHAU.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDHAW.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDHE.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDHE220.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDHE319.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDHEB.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDHELA2.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDHELA3.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDHEPT.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDHU.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDHU1.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDIBO.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDIC.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDINASA.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDINBE2.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDINDEV.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDINEN.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDINGUJ.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDINHIN.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDINKAN.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDINMAR.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDINORI.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDINPUN.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDINTAM.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDINTEL.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDINUK2.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDIR.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDIT.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDIT142.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDIULAT.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDJAV.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDJPN.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDKAZ.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDKHMR.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDKNI.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDKOR.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDKURD.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDKYR.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDLA.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDLAO.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDLT.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDLT1.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDLT2.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDLV.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDLV1.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDLVST.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDMAC.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDMACST.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDMON.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDMONMO.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDMONST.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDMYAN.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDNE.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDNO.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDNSO.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDNTL.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDOGHAM.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDOLCH.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDOLDIT.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDOSA.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDOSM.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDPL.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDPL1.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDPO.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDRO.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDROPR.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDROST.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDRU.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDRU1.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDRUM.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDSF.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDSG.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDSL.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDSL1.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDSN1.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDSORA.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDSOREX.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDSORS1.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDSORST.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDSP.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDSW.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDSW09.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDSYR1.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDSYR2.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDTAILE.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDTAJIK.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDTAM99.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDTAT.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDTH0.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDTH1.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDTH2.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDTH3.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDTIFI.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDTIFI2.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDTIPRC.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDTIPRD.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDTT102.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDTUF.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDTUQ.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDTURME.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDTZM.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDUGHR.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDUGHR1.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDUK.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDUR.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDUR1.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDURDU.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDUS.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDUSA.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDUSL.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDUSR.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDUSX.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDUZB.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDVNTC.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDWOL.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDYAK.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDYBA.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDYCC.py +1 -0
- aardwolf/keyboard/layouts/layout_KBDYCL.py +1 -0
- aardwolf/keyboard/layouts/layout_kbd101.py +1 -0
- aardwolf/keyboard/layouts/layout_kbd101a.py +1 -0
- aardwolf/keyboard/layouts/layout_kbd101b.py +1 -0
- aardwolf/keyboard/layouts/layout_kbd101c.py +1 -0
- aardwolf/keyboard/layouts/layout_kbd103.py +1 -0
- aardwolf/keyboard/layouts/layout_kbd106.py +1 -0
- aardwolf/keyboard/layouts/layout_kbd106n.py +1 -0
- aardwolf/keyboard/layouts/layout_kbdarmph.py +1 -0
- aardwolf/keyboard/layouts/layout_kbdarmty.py +1 -0
- aardwolf/keyboard/layouts/layout_kbdax2.py +1 -0
- aardwolf/keyboard/layouts/layout_kbdbhc.py +1 -0
- aardwolf/keyboard/layouts/layout_kbdfar.py +1 -0
- aardwolf/keyboard/layouts/layout_kbdfi1.py +1 -0
- aardwolf/keyboard/layouts/layout_kbdgeoer.py +1 -0
- aardwolf/keyboard/layouts/layout_kbdgeome.py +1 -0
- aardwolf/keyboard/layouts/layout_kbdgeooa.py +1 -0
- aardwolf/keyboard/layouts/layout_kbdgeoqw.py +1 -0
- aardwolf/keyboard/layouts/layout_kbdhebl3.py +1 -0
- aardwolf/keyboard/layouts/layout_kbdibm02.py +1 -0
- aardwolf/keyboard/layouts/layout_kbdinbe1.py +1 -0
- aardwolf/keyboard/layouts/layout_kbdinben.py +1 -0
- aardwolf/keyboard/layouts/layout_kbdinmal.py +1 -0
- aardwolf/keyboard/layouts/layout_kbdlisub.py +1 -0
- aardwolf/keyboard/layouts/layout_kbdlisus.py +1 -0
- aardwolf/keyboard/layouts/layout_kbdlk41a.py +1 -0
- aardwolf/keyboard/layouts/layout_kbdmaori.py +1 -0
- aardwolf/keyboard/layouts/layout_kbdmlt47.py +1 -0
- aardwolf/keyboard/layouts/layout_kbdmlt48.py +1 -0
- aardwolf/keyboard/layouts/layout_kbdne.py +1 -0
- aardwolf/keyboard/layouts/layout_kbdnec.py +1 -0
- aardwolf/keyboard/layouts/layout_kbdnec95.py +1 -0
- aardwolf/keyboard/layouts/layout_kbdnecat.py +1 -0
- aardwolf/keyboard/layouts/layout_kbdnecnt.py +1 -0
- aardwolf/keyboard/layouts/layout_kbdnepr.py +1 -0
- aardwolf/keyboard/layouts/layout_kbdnko.py +1 -0
- aardwolf/keyboard/layouts/layout_kbdno1.py +1 -0
- aardwolf/keyboard/layouts/layout_kbdpash.py +1 -0
- aardwolf/keyboard/layouts/layout_kbdphags.py +1 -0
- aardwolf/keyboard/layouts/layout_kbdsmsfi.py +1 -0
- aardwolf/keyboard/layouts/layout_kbdsmsno.py +1 -0
- aardwolf/keyboard/layouts/layout_kbdukx.py +1 -0
- aardwolf/keyboard/webparser.py +256 -0
- aardwolf/network/__init__.py +0 -0
- aardwolf/network/tpkt.py +116 -0
- aardwolf/network/x224.py +60 -0
- aardwolf/protocol/T124/GCCPDU.asn +1181 -0
- aardwolf/protocol/T124/GCCPDU.py +1183 -0
- aardwolf/protocol/T124/__init__.py +0 -0
- aardwolf/protocol/T124/userdata/__init__.py +128 -0
- aardwolf/protocol/T124/userdata/clientclusterdata.py +47 -0
- aardwolf/protocol/T124/userdata/clientcoredata.py +192 -0
- aardwolf/protocol/T124/userdata/clientmessagechanneldata.py +42 -0
- aardwolf/protocol/T124/userdata/clientmonitorextendeddata.py +93 -0
- aardwolf/protocol/T124/userdata/clientmultitransportchanneldata.py +42 -0
- aardwolf/protocol/T124/userdata/clientnetworkdata.py +84 -0
- aardwolf/protocol/T124/userdata/clientsecuritydata.py +45 -0
- aardwolf/protocol/T124/userdata/constants.py +112 -0
- aardwolf/protocol/T124/userdata/monitordefinition.py +87 -0
- aardwolf/protocol/T124/userdata/servercoredata.py +58 -0
- aardwolf/protocol/T124/userdata/servermessagechannel.py +41 -0
- aardwolf/protocol/T124/userdata/servermultitransportchanneldata.py +41 -0
- aardwolf/protocol/T124/userdata/servernetworkdata.py +55 -0
- aardwolf/protocol/T124/userdata/serversecuritydata.py +221 -0
- aardwolf/protocol/T125/MCSPDU.ver.2.asn +582 -0
- aardwolf/protocol/T125/MCSPDU.ver.3.asn +750 -0
- aardwolf/protocol/T125/MCSPDU_ver_2.py +584 -0
- aardwolf/protocol/T125/__init__.py +0 -0
- aardwolf/protocol/T125/extendedinfopacket.py +235 -0
- aardwolf/protocol/T125/infopacket.py +122 -0
- aardwolf/protocol/T125/securityexchangepdu.py +37 -0
- aardwolf/protocol/T128/__init__.py +0 -0
- aardwolf/protocol/T128/clientconfirmactivepdu.py +66 -0
- aardwolf/protocol/T128/controlpdu.py +48 -0
- aardwolf/protocol/T128/fontlistpdu.py +45 -0
- aardwolf/protocol/T128/fontmappdu.py +45 -0
- aardwolf/protocol/T128/inputeventpdu.py +49 -0
- aardwolf/protocol/T128/persistentbitmapcachepdu.py +103 -0
- aardwolf/protocol/T128/security.py +130 -0
- aardwolf/protocol/T128/serverdemandactivepdu.py +67 -0
- aardwolf/protocol/T128/seterrorinfopdu.py +172 -0
- aardwolf/protocol/T128/share.py +140 -0
- aardwolf/protocol/T128/synchronizepdu.py +40 -0
- aardwolf/protocol/__init__.py +0 -0
- aardwolf/protocol/channelpdu.py +60 -0
- aardwolf/protocol/fastpath/__init__.py +214 -0
- aardwolf/protocol/fastpath/bitmap.py +155 -0
- aardwolf/protocol/fastpath/order.py +0 -0
- aardwolf/protocol/fastpath/palette.py +81 -0
- aardwolf/protocol/fastpath/pointer.py +244 -0
- aardwolf/protocol/fastpath/surface.py +299 -0
- aardwolf/protocol/pdu/__init__.py +0 -0
- aardwolf/protocol/pdu/capabilities/__init__.py +153 -0
- aardwolf/protocol/pdu/capabilities/bitmamachachehostsupp.py +35 -0
- aardwolf/protocol/pdu/capabilities/bitmap.py +77 -0
- aardwolf/protocol/pdu/capabilities/bitmapcache.py +49 -0
- aardwolf/protocol/pdu/capabilities/bitmapcache2.py +96 -0
- aardwolf/protocol/pdu/capabilities/bitmapcodecs.py +34 -0
- aardwolf/protocol/pdu/capabilities/brush.py +37 -0
- aardwolf/protocol/pdu/capabilities/colortablecache.py +36 -0
- aardwolf/protocol/pdu/capabilities/compdesk.py +36 -0
- aardwolf/protocol/pdu/capabilities/control.py +42 -0
- aardwolf/protocol/pdu/capabilities/font.py +35 -0
- aardwolf/protocol/pdu/capabilities/frameack.py +32 -0
- aardwolf/protocol/pdu/capabilities/gdiplus.py +0 -0
- aardwolf/protocol/pdu/capabilities/general.py +94 -0
- aardwolf/protocol/pdu/capabilities/glyph.py +47 -0
- aardwolf/protocol/pdu/capabilities/input.py +68 -0
- aardwolf/protocol/pdu/capabilities/largepointer.py +37 -0
- aardwolf/protocol/pdu/capabilities/multifragmentupdate.py +32 -0
- aardwolf/protocol/pdu/capabilities/ninegrid.py +43 -0
- aardwolf/protocol/pdu/capabilities/offscreen.py +38 -0
- aardwolf/protocol/pdu/capabilities/order.py +134 -0
- aardwolf/protocol/pdu/capabilities/pointer.py +39 -0
- aardwolf/protocol/pdu/capabilities/remoteprograms.py +42 -0
- aardwolf/protocol/pdu/capabilities/share.py +36 -0
- aardwolf/protocol/pdu/capabilities/sound.py +39 -0
- aardwolf/protocol/pdu/capabilities/surface.py +40 -0
- aardwolf/protocol/pdu/capabilities/virtualchannel.py +45 -0
- aardwolf/protocol/pdu/capabilities/windowactivation.py +42 -0
- aardwolf/protocol/pdu/capabilities/windowlist.py +43 -0
- aardwolf/protocol/pdu/input/__init__.py +83 -0
- aardwolf/protocol/pdu/input/keyboard.py +49 -0
- aardwolf/protocol/pdu/input/mouse.py +50 -0
- aardwolf/protocol/pdu/input/mousex.py +43 -0
- aardwolf/protocol/pdu/input/sync.py +41 -0
- aardwolf/protocol/pdu/input/unicode.py +39 -0
- aardwolf/protocol/pdu/input/unused.py +35 -0
- aardwolf/protocol/tpkt.py +39 -0
- aardwolf/protocol/vnc/__init__.py +0 -0
- aardwolf/protocol/vnc/keyboard.py +82 -0
- aardwolf/protocol/x224/__init__.py +17 -0
- aardwolf/protocol/x224/client/__init__.py +0 -0
- aardwolf/protocol/x224/client/connectionrequest.py +147 -0
- aardwolf/protocol/x224/constants.py +134 -0
- aardwolf/protocol/x224/data.py +43 -0
- aardwolf/protocol/x224/server/__init__.py +0 -0
- aardwolf/protocol/x224/server/connectionconfirm.py +134 -0
- aardwolf/transport/__init__.py +0 -0
- aardwolf/transport/tcpstream.py +158 -0
- aardwolf/utils/__init__.py +0 -0
- aardwolf/utils/apq.py +63 -0
- aardwolf/utils/ducky/__init__.py +407 -0
- aardwolf/utils/qt.py +51 -0
- aardwolf/utils/rectconvert.py +14 -0
- aardwolf/utils/rlers/Cargo.toml +23 -0
- aardwolf/utils/rlers/__init__.py +0 -0
- aardwolf/utils/rlers/pyproject.toml +12 -0
- aardwolf/utils/rlers/src/rle.rs +729 -0
- aardwolf/utils/univeraljson.py +22 -0
- aardwolf/vncconnection.py +844 -0
- aardwolf-0.2.7.dist-info/LICENSE +21 -0
- aardwolf-0.2.7.dist-info/METADATA +22 -0
- aardwolf-0.2.7.dist-info/RECORD +591 -0
- aardwolf-0.2.7.dist-info/WHEEL +5 -0
- aardwolf-0.2.7.dist-info/entry_points.txt +2 -0
- aardwolf-0.2.7.dist-info/top_level.txt +1 -0
- librlers.cpython-39-arm-linux-gnueabihf.so +0 -0
aardwolf/__init__.py
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
|
|
3
|
+
logger = logging.getLogger(__name__)
|
|
4
|
+
handler = logging.StreamHandler()
|
|
5
|
+
formatter = logging.Formatter(
|
|
6
|
+
'%(asctime)s %(name)-12s %(levelname)-8s %(message)s')
|
|
7
|
+
handler.setFormatter(formatter)
|
|
8
|
+
logger.addHandler(handler)
|
|
9
|
+
logger.setLevel(logging.INFO)
|
|
10
|
+
logger.propagate = False
|
aardwolf/_version.py
ADDED
aardwolf/channels.py
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
|
|
2
|
+
import asyncio
|
|
3
|
+
import traceback
|
|
4
|
+
|
|
5
|
+
from aardwolf.protocol.T124.userdata.constants import ChannelOption
|
|
6
|
+
|
|
7
|
+
class Channel:
|
|
8
|
+
def __init__(self, name:str, options:ChannelOption = ChannelOption.INITIALIZED|ChannelOption.ENCRYPT_RDP):
|
|
9
|
+
self.name = name
|
|
10
|
+
self.options = options
|
|
11
|
+
self.channel_id = None
|
|
12
|
+
self.connection = None
|
|
13
|
+
|
|
14
|
+
def get_name(self):
|
|
15
|
+
return self.name
|
|
16
|
+
|
|
17
|
+
async def disconnect(self):
|
|
18
|
+
try:
|
|
19
|
+
_, err = await self.stop()
|
|
20
|
+
if err is not None:
|
|
21
|
+
raise err
|
|
22
|
+
except:
|
|
23
|
+
pass
|
|
24
|
+
|
|
25
|
+
async def run(self, connection):
|
|
26
|
+
try:
|
|
27
|
+
self.connection = connection
|
|
28
|
+
_, err = await self.start()
|
|
29
|
+
if err is not None:
|
|
30
|
+
raise err
|
|
31
|
+
return True, None
|
|
32
|
+
except Exception as e:
|
|
33
|
+
traceback.print_exc()
|
|
34
|
+
return None, e
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
async def start(self):
|
|
38
|
+
# Override this when implementing new channel type
|
|
39
|
+
try:
|
|
40
|
+
return True, None
|
|
41
|
+
except Exception as e:
|
|
42
|
+
return None, e
|
|
43
|
+
|
|
44
|
+
async def stop(self):
|
|
45
|
+
# Override this when implementing new channel type
|
|
46
|
+
try:
|
|
47
|
+
return True, None
|
|
48
|
+
except Exception as e:
|
|
49
|
+
return None, e
|
|
50
|
+
|
|
51
|
+
async def process_channel_data(self, data):
|
|
52
|
+
# This function will be called when channel data is recieved from the server
|
|
53
|
+
raise NotImplementedError()
|
|
54
|
+
|
|
55
|
+
async def process_user_data(self, data):
|
|
56
|
+
# This function will be called when the channel recieves a new user data
|
|
57
|
+
# Override this function to implement user data processing
|
|
58
|
+
raise NotImplementedError()
|
|
59
|
+
|
|
60
|
+
async def send_channel_data(self, dataobj, sec_hdr, datacontrol_hdr, sharecontrol_hdr, is_fastpath):
|
|
61
|
+
await self.connection.handle_out_data(dataobj, sec_hdr, datacontrol_hdr, sharecontrol_hdr, self.channel_id, is_fastpath)
|
|
62
|
+
|
|
63
|
+
async def send_user_data(self, msg):
|
|
64
|
+
await self.connection.ext_out_queue.put(msg)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
class MCSChannel(Channel):
|
|
68
|
+
name = 'MCS'
|
|
69
|
+
def __init__(self, iosettings = None):
|
|
70
|
+
Channel.__init__(self, self.name, ChannelOption.INITIALIZED|ChannelOption.ENCRYPT_RDP)
|
|
71
|
+
self.out_queue = asyncio.Queue()
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
async def process_channel_data(self, data):
|
|
75
|
+
# This function will be called when channel data is recieved from the server
|
|
76
|
+
#print('Channel data in! "%s(%s)" <- %s' % (self.name, self.channel_id, data))
|
|
77
|
+
await self.out_queue.put((data, None))
|
|
File without changes
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
import os
|
|
2
|
+
from hashlib import md5, sha1
|
|
3
|
+
from arc4 import ARC4 as RC4
|
|
4
|
+
|
|
5
|
+
class RDPCryptoLayer:
|
|
6
|
+
def __init__(self, ServerRandom, keysize = 128, is_FIPS = False):
|
|
7
|
+
self.keysize = keysize
|
|
8
|
+
self.ClientRandom:bytes = os.urandom(32) #os.urandom(keysize//8)
|
|
9
|
+
self.ServerRandom:bytes = ServerRandom
|
|
10
|
+
self.PacketCount:int = 0
|
|
11
|
+
self.PacketCountServer:int = 0
|
|
12
|
+
self.PreMasterSecret:bytes = self.First192Bits(self.ClientRandom) + self.First192Bits(self.ServerRandom)
|
|
13
|
+
self.MasterSecret:bytes = None
|
|
14
|
+
self.SessionKeyBlob:bytes = None
|
|
15
|
+
self.MACKey128:bytes = None
|
|
16
|
+
self.InitialServerEncryptKey128:bytes = None
|
|
17
|
+
self.InitialServerDecryptKey128:bytes = None
|
|
18
|
+
self.InitialClientDecryptKey128:bytes = None
|
|
19
|
+
self.InitialClientEncryptKey128:bytes = None
|
|
20
|
+
self.CurrentClientDecryptKey128:bytes = None
|
|
21
|
+
self.CurrentClientEncryptKey128:bytes = None
|
|
22
|
+
|
|
23
|
+
self.MACKey40:bytes = None
|
|
24
|
+
self.InitialServerEncryptKey40:bytes = None
|
|
25
|
+
self.InitialServerDecryptKey40:bytes = None
|
|
26
|
+
self.InitialClientEncryptKey40:bytes = None
|
|
27
|
+
self.InitialClientDecryptKey40:bytes = None
|
|
28
|
+
self.CurrentClientDecryptKey40:bytes = None
|
|
29
|
+
self.CurrentClientEncryptKey40:bytes = None
|
|
30
|
+
|
|
31
|
+
self.MACKey56:bytes = None
|
|
32
|
+
self.InitialServerEncryptKey56:bytes = None
|
|
33
|
+
self.InitialServerDecryptKey56:bytes = None
|
|
34
|
+
self.InitialClientEncryptKey56:bytes = None
|
|
35
|
+
self.InitialClientDecryptKey56:bytes = None
|
|
36
|
+
self.CurrentClientDecryptKey56:bytes = None
|
|
37
|
+
self.CurrentClientEncryptKey56:bytes = None
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
self.client_crypto_enc = None
|
|
42
|
+
self.client_crypto_dec = None
|
|
43
|
+
self.server_crypto_enc = None
|
|
44
|
+
self.server_crypto_dec = None
|
|
45
|
+
self.current_mac = None
|
|
46
|
+
self.use_encrypted_mac = False #initial
|
|
47
|
+
|
|
48
|
+
self.setup()
|
|
49
|
+
|
|
50
|
+
def client_enc(self, data:bytes):
|
|
51
|
+
"""Use this if you are a client and wanna send data to server"""
|
|
52
|
+
#print('PacketCount %s' % self.PacketCount)
|
|
53
|
+
if self.PacketCount != 0 and self.PacketCount % 4096 == 0:
|
|
54
|
+
#print('Updating keys!')
|
|
55
|
+
self.UpdateKeys(False)
|
|
56
|
+
self.PacketCount += 1
|
|
57
|
+
return self.client_crypto_enc.encrypt(data)
|
|
58
|
+
|
|
59
|
+
def client_dec(self, data:bytes):
|
|
60
|
+
"""Use this if you are a client and just got data from the server"""
|
|
61
|
+
#print('PacketCountServer %s' % self.PacketCountServer)
|
|
62
|
+
if self.PacketCountServer != 0 and self.PacketCountServer % 4096 == 0:
|
|
63
|
+
#print('Updating keys!')
|
|
64
|
+
self.UpdateKeys(True)
|
|
65
|
+
self.PacketCountServer += 1
|
|
66
|
+
return self.client_crypto_dec.encrypt(data)
|
|
67
|
+
|
|
68
|
+
def server_enc(self, data:bytes):
|
|
69
|
+
return self.server_crypto_enc.encrypt(data)
|
|
70
|
+
|
|
71
|
+
def server_dec(self, data:bytes):
|
|
72
|
+
return self.server_crypto_dec.encrypt(data)
|
|
73
|
+
|
|
74
|
+
def calc_mac(self, data:bytes):
|
|
75
|
+
# https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-rdpbcgr/7c61b54e-f6cd-4819-a59a-daf200f6bf94
|
|
76
|
+
Pad1 = b'\x36'*40 # repeated 40 times to give 320 bits
|
|
77
|
+
Pad2 = b'\x5C'*48 # repeated 48 times to give 384 bits
|
|
78
|
+
|
|
79
|
+
DataLength = len(data).to_bytes(4, byteorder='little', signed=False)
|
|
80
|
+
|
|
81
|
+
SHAComponent = sha1(self.current_mac + Pad1 + DataLength + data).digest()
|
|
82
|
+
return self.First64Bits(md5(self.current_mac + Pad2 + SHAComponent).digest())
|
|
83
|
+
|
|
84
|
+
def calc_salted_mac(self, data:bytes, is_server:bool = False):
|
|
85
|
+
# https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-rdpbcgr/f390586a-3fdd-4a96-bbe0-a31575e92056
|
|
86
|
+
Pad1 = b'\x36'*40 # repeated 40 times to give 320 bits
|
|
87
|
+
Pad2 = b'\x5C'*48 # repeated 48 times to give 384 bits
|
|
88
|
+
|
|
89
|
+
DataLength = len(data).to_bytes(4, byteorder='little', signed=False)
|
|
90
|
+
|
|
91
|
+
if is_server is True:
|
|
92
|
+
EncryptionCount = (self.PacketCountServer-1).to_bytes(4, byteorder='little', signed=False)
|
|
93
|
+
else:
|
|
94
|
+
EncryptionCount = self.PacketCount.to_bytes(4, byteorder='little', signed=False)
|
|
95
|
+
|
|
96
|
+
SHAComponent = sha1(self.current_mac + Pad1 + DataLength + data + EncryptionCount).digest()
|
|
97
|
+
return self.First64Bits(md5(self.current_mac + Pad2 + SHAComponent).digest())
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def setup(self):
|
|
101
|
+
self.MasterSecret = self.PreMasterHash(b'\x41') + self.PreMasterHash(b'\x42\x42') + self.PreMasterHash(b'\x43\x43\x43')
|
|
102
|
+
self.SessionKeyBlob = self.MasterHash(b'\x58') + self.MasterHash(b'\x59\x59') + self.MasterHash(b'\x5A\x5A\x5A')
|
|
103
|
+
self.MACKey128 = self.First128Bits(self.SessionKeyBlob)
|
|
104
|
+
|
|
105
|
+
self.InitialServerEncryptKey128 = self.FinalHash(self.Second128Bits(self.SessionKeyBlob))
|
|
106
|
+
self.InitialServerDecryptKey128 = self.FinalHash(self.Third128Bits(self.SessionKeyBlob))
|
|
107
|
+
self.InitialClientDecryptKey128 = self.FinalHash(self.Second128Bits(self.SessionKeyBlob))
|
|
108
|
+
self.InitialClientEncryptKey128 = self.FinalHash(self.Third128Bits(self.SessionKeyBlob))
|
|
109
|
+
|
|
110
|
+
self.MACKey40 = b'\xD1\x26\x9E' + self.Last40Bits(self.First64Bits(self.MACKey128))
|
|
111
|
+
|
|
112
|
+
self.InitialServerEncryptKey40 = b'\xD1\x26\x9E' + self.Last40Bits(self.First64Bits(self.InitialServerEncryptKey128))
|
|
113
|
+
self.InitialServerDecryptKey40 = b'\xD1\x26\x9E' + self.Last40Bits(self.First64Bits(self.InitialServerDecryptKey128))
|
|
114
|
+
|
|
115
|
+
self.InitialClientEncryptKey40 = b'\xD1\x26\x9E' + self.Last40Bits(self.First64Bits(self.InitialClientEncryptKey128))
|
|
116
|
+
self.InitialClientDecryptKey40 = b'\xD1\x26\x9E' + self.Last40Bits(self.First64Bits(self.InitialClientDecryptKey128))
|
|
117
|
+
|
|
118
|
+
self.MACKey56 = b'\xD1' + self.Last56Bits(self.First64Bits(self.MACKey128))
|
|
119
|
+
|
|
120
|
+
self.InitialServerEncryptKey56 = b'\xD1' + self.Last56Bits(self.First64Bits(self.InitialServerEncryptKey128))
|
|
121
|
+
self.InitialServerDecryptKey56 = b'\xD1' + self.Last56Bits(self.First64Bits(self.InitialServerDecryptKey128))
|
|
122
|
+
|
|
123
|
+
self.InitialClientEncryptKey56 = b'\xD1' + self.Last56Bits(self.First64Bits(self.InitialClientEncryptKey128))
|
|
124
|
+
self.InitialClientDecryptKey56 = b'\xD1' + self.Last56Bits(self.First64Bits(self.InitialClientDecryptKey128))
|
|
125
|
+
|
|
126
|
+
if self.keysize == 128:
|
|
127
|
+
self.current_mac = self.MACKey128
|
|
128
|
+
self.server_crypto_enc = RC4(self.InitialServerEncryptKey128)
|
|
129
|
+
self.server_crypto_dec = RC4(self.InitialServerDecryptKey128)
|
|
130
|
+
self.client_crypto_dec = RC4(self.InitialClientDecryptKey128)
|
|
131
|
+
self.client_crypto_enc = RC4(self.InitialClientEncryptKey128)
|
|
132
|
+
|
|
133
|
+
self.CurrentClientDecryptKey128 = self.InitialClientDecryptKey128
|
|
134
|
+
self.CurrentClientEncryptKey128 = self.InitialClientEncryptKey128
|
|
135
|
+
|
|
136
|
+
if self.keysize == 56:
|
|
137
|
+
self.current_mac = self.MACKey56
|
|
138
|
+
self.server_crypto_enc = RC4(self.InitialServerEncryptKey56)
|
|
139
|
+
self.server_crypto_dec = RC4(self.InitialServerDecryptKey56)
|
|
140
|
+
self.client_crypto_dec = RC4(self.InitialClientDecryptKey56)
|
|
141
|
+
self.client_crypto_enc = RC4(self.InitialClientEncryptKey56)
|
|
142
|
+
|
|
143
|
+
self.CurrentClientDecryptKey56 = self.InitialClientDecryptKey56
|
|
144
|
+
self.CurrentClientEncryptKey56 = self.InitialClientEncryptKey56
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
if self.keysize == 40:
|
|
148
|
+
self.current_mac = self.MACKey40
|
|
149
|
+
self.server_crypto_enc = RC4(self.InitialServerEncryptKey40)
|
|
150
|
+
self.server_crypto_dec = RC4(self.InitialServerDecryptKey40)
|
|
151
|
+
self.client_crypto_dec = RC4(self.InitialClientDecryptKey40)
|
|
152
|
+
self.client_crypto_enc = RC4(self.InitialClientEncryptKey40)
|
|
153
|
+
|
|
154
|
+
self.CurrentClientDecryptKey40 = self.InitialClientDecryptKey40
|
|
155
|
+
self.CurrentClientEncryptKey40 = self.InitialClientEncryptKey40
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def UpdateKeys(self, is_server:bool = False):
|
|
160
|
+
# https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-rdpbcgr/a4551a30-db5c-437a-a170-a3934cf8770e
|
|
161
|
+
# The encryption and the decryption keys are updated after 4,096 packets have been sent or received.
|
|
162
|
+
|
|
163
|
+
Pad1 = b'\x36' * 40 #repeated 40 times to give 320 bits
|
|
164
|
+
Pad2 = b'\x5C' * 48 #repeated 48 times to give 384 bits
|
|
165
|
+
|
|
166
|
+
if self.keysize == 128:
|
|
167
|
+
if is_server is True:
|
|
168
|
+
InitialEncryptKey = self.InitialClientDecryptKey128
|
|
169
|
+
CurrentEncryptKey = self.CurrentClientDecryptKey128
|
|
170
|
+
else:
|
|
171
|
+
InitialEncryptKey = self.InitialClientEncryptKey128
|
|
172
|
+
CurrentEncryptKey = self.CurrentClientEncryptKey128
|
|
173
|
+
|
|
174
|
+
if self.keysize == 56:
|
|
175
|
+
if is_server is True:
|
|
176
|
+
InitialEncryptKey = self.First64Bits(self.InitialClientDecryptKey56)
|
|
177
|
+
CurrentEncryptKey = self.First64Bits(self.CurrentClientDecryptKey56)
|
|
178
|
+
else:
|
|
179
|
+
InitialEncryptKey = self.First64Bits(self.InitialClientEncryptKey56)
|
|
180
|
+
CurrentEncryptKey = self.First64Bits(self.CurrentClientEncryptKey56)
|
|
181
|
+
|
|
182
|
+
if self.keysize == 40:
|
|
183
|
+
if is_server is True:
|
|
184
|
+
InitialEncryptKey = self.First64Bits(self.InitialClientDecryptKey40)
|
|
185
|
+
CurrentEncryptKey = self.First64Bits(self.CurrentClientDecryptKey40)
|
|
186
|
+
else:
|
|
187
|
+
InitialEncryptKey = self.First64Bits(self.InitialClientEncryptKey40)
|
|
188
|
+
CurrentEncryptKey = self.First64Bits(self.CurrentClientEncryptKey40)
|
|
189
|
+
|
|
190
|
+
SHAComponent = sha1(InitialEncryptKey + Pad1 + CurrentEncryptKey).digest()
|
|
191
|
+
TempKey128 = md5(InitialEncryptKey + Pad2 + SHAComponent).digest()
|
|
192
|
+
TempKey64 = self.First64Bits(TempKey128)
|
|
193
|
+
|
|
194
|
+
if self.keysize == 128:
|
|
195
|
+
ctx = RC4(TempKey128)
|
|
196
|
+
if is_server is True:
|
|
197
|
+
self.CurrentClientDecryptKey128 = ctx.encrypt(TempKey128)
|
|
198
|
+
self.client_crypto_dec = RC4(self.CurrentClientDecryptKey128)
|
|
199
|
+
else:
|
|
200
|
+
self.CurrentClientEncryptKey128 = ctx.encrypt(TempKey128)
|
|
201
|
+
self.client_crypto_enc = RC4(self.CurrentClientEncryptKey128)
|
|
202
|
+
else:
|
|
203
|
+
ctx = RC4(TempKey64)
|
|
204
|
+
PreSaltKey = ctx.encrypt(TempKey64)
|
|
205
|
+
NewEncryptKey40 = 0xD1269E + self.Last40Bits(PreSaltKey)
|
|
206
|
+
NewEncryptKey56 = 0xD1 + self.Last56Bits(PreSaltKey)
|
|
207
|
+
|
|
208
|
+
if self.keysize == 56:
|
|
209
|
+
if is_server is True:
|
|
210
|
+
self.CurrentClientDecryptKey56 = ctx.encrypt(NewEncryptKey56)
|
|
211
|
+
self.client_crypto_dec = RC4(self.CurrentClientDecryptKey56)
|
|
212
|
+
else:
|
|
213
|
+
self.CurrentClientEncryptKey56 = ctx.encrypt(NewEncryptKey56)
|
|
214
|
+
self.client_crypto_enc = RC4(self.CurrentClientEncryptKey56)
|
|
215
|
+
|
|
216
|
+
if self.keysize == 40:
|
|
217
|
+
if is_server is True:
|
|
218
|
+
self.CurrentClientDecryptKey40 = ctx.encrypt(NewEncryptKey40)
|
|
219
|
+
self.client_crypto_dec = RC4(self.CurrentClientDecryptKey40)
|
|
220
|
+
else:
|
|
221
|
+
self.CurrentClientEncryptKey40 = ctx.encrypt(NewEncryptKey40)
|
|
222
|
+
self.client_crypto_enc = RC4(self.CurrentClientEncryptKey40)
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
def Last56Bits(self, x:bytes):
|
|
226
|
+
return x[-7:]
|
|
227
|
+
|
|
228
|
+
def First64Bits(self, x:bytes):
|
|
229
|
+
return x[:8]
|
|
230
|
+
|
|
231
|
+
def Last40Bits(self, x:bytes):
|
|
232
|
+
return x[-5:]
|
|
233
|
+
|
|
234
|
+
def Second128Bits(self, x:bytes):
|
|
235
|
+
return x[16:32]
|
|
236
|
+
|
|
237
|
+
def Third128Bits(self, x:bytes):
|
|
238
|
+
return x[32:48]
|
|
239
|
+
|
|
240
|
+
def First192Bits(self, x:bytes):
|
|
241
|
+
return x[:24]
|
|
242
|
+
|
|
243
|
+
def First128Bits(self, x:bytes):
|
|
244
|
+
return x[:16]
|
|
245
|
+
|
|
246
|
+
def SaltedHash(self, S:bytes, I:bytes):
|
|
247
|
+
return md5(S + sha1(I + S + self.ClientRandom + self.ServerRandom).digest()).digest()
|
|
248
|
+
|
|
249
|
+
def MasterHash(self, I:bytes):
|
|
250
|
+
return self.SaltedHash(self.MasterSecret, I)
|
|
251
|
+
|
|
252
|
+
def FinalHash(self, K:bytes):
|
|
253
|
+
return md5(K + self.ClientRandom + self.ServerRandom).digest()
|
|
254
|
+
|
|
255
|
+
def PreMasterHash(self, x:bytes):
|
|
256
|
+
return self.SaltedHash(self.PreMasterSecret, x)
|
|
257
|
+
|
|
258
|
+
|
|
259
|
+
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import enum
|
|
2
|
+
from typing import List
|
|
3
|
+
from asysocks.unicomm.common.proxy import UniProxyProto, UniProxyTarget
|
|
4
|
+
from aardwolf.commons.iosettings import RDPIOSettings
|
|
5
|
+
|
|
6
|
+
from aardwolf.commons.target import RDPTarget, RDPConnectionDialect
|
|
7
|
+
from asyauth.common.credentials import UniCredential
|
|
8
|
+
from aardwolf.connection import RDPConnection
|
|
9
|
+
from aardwolf.vncconnection import VNCConnection
|
|
10
|
+
import ipaddress
|
|
11
|
+
import copy
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class RDPConnectionFactory:
|
|
15
|
+
def __init__(self, iosettings=None, target:RDPTarget = None, credential:UniCredential = None, proxies:List[UniProxyTarget] = None):
|
|
16
|
+
self.credential = credential
|
|
17
|
+
self.target = target
|
|
18
|
+
self.proxies = proxies
|
|
19
|
+
self.iosettings = iosettings
|
|
20
|
+
|
|
21
|
+
def get_connection(self, iosettings):
|
|
22
|
+
tio = copy.deepcopy(iosettings)
|
|
23
|
+
credential = self.get_credential()
|
|
24
|
+
target = self.get_target()
|
|
25
|
+
if target.dialect is not None:
|
|
26
|
+
if target.dialect == RDPConnectionDialect.RDP:
|
|
27
|
+
return RDPConnection(target, credential, tio)
|
|
28
|
+
elif target.dialect == RDPConnectionDialect.VNC:
|
|
29
|
+
return VNCConnection(target, credential, tio)
|
|
30
|
+
else:
|
|
31
|
+
raise Exception('Unknown dialect %s' % target.dialect)
|
|
32
|
+
raise Exception('Either target or dialect must be defined first!')
|
|
33
|
+
|
|
34
|
+
def create_connection_newtarget(self, ip_or_hostname, iosettings):
|
|
35
|
+
tio = copy.deepcopy(iosettings)
|
|
36
|
+
credential = self.get_credential()
|
|
37
|
+
|
|
38
|
+
target = self.get_target()
|
|
39
|
+
try:
|
|
40
|
+
ipaddress.ip_address(ip_or_hostname)
|
|
41
|
+
target.ip = ip_or_hostname
|
|
42
|
+
target.hostname = None
|
|
43
|
+
except:
|
|
44
|
+
target.hostname = ip_or_hostname
|
|
45
|
+
target.ip = ip_or_hostname
|
|
46
|
+
|
|
47
|
+
if target.dialect == RDPConnectionDialect.RDP:
|
|
48
|
+
return RDPConnection(target, credential, tio)
|
|
49
|
+
elif target.dialect == RDPConnectionDialect.VNC:
|
|
50
|
+
return VNCConnection(target, credential, tio)
|
|
51
|
+
else:
|
|
52
|
+
raise Exception('Unknown dialect %s' % target.dialect)
|
|
53
|
+
|
|
54
|
+
def get_proxy(self) -> List[UniProxyTarget]:
|
|
55
|
+
return copy.deepcopy(self.target.proxies)
|
|
56
|
+
|
|
57
|
+
def get_target(self) -> RDPTarget:
|
|
58
|
+
return copy.deepcopy(self.target)
|
|
59
|
+
|
|
60
|
+
def get_credential(self) -> UniCredential:
|
|
61
|
+
return copy.deepcopy(self.credential)
|
|
62
|
+
|
|
63
|
+
def get_settings(self) -> RDPIOSettings:
|
|
64
|
+
return copy.deepcopy(self.iosettings)
|
|
65
|
+
|
|
66
|
+
@staticmethod
|
|
67
|
+
def from_url(connection_url, iosettings):
|
|
68
|
+
target = RDPTarget.from_url(connection_url)
|
|
69
|
+
credential = UniCredential.from_url(connection_url)
|
|
70
|
+
return RDPConnectionFactory(iosettings, target, credential)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def __str__(self):
|
|
74
|
+
t = '==== RDPConnectionFactory ====\r\n'
|
|
75
|
+
for k in self.__dict__:
|
|
76
|
+
val = self.__dict__[k]
|
|
77
|
+
if isinstance(val, enum.IntFlag):
|
|
78
|
+
val = val
|
|
79
|
+
elif isinstance(val, enum.Enum):
|
|
80
|
+
val = val.name
|
|
81
|
+
|
|
82
|
+
t += '%s: %s\r\n' % (k, str(val))
|
|
83
|
+
|
|
84
|
+
return t
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
if __name__ == '__main__':
|
|
89
|
+
url_tests = [
|
|
90
|
+
#'RDP://10.10.10.2',
|
|
91
|
+
#'RDP://10.10.10.2:9000',
|
|
92
|
+
#'RDP-tcp://10.10.10.2',
|
|
93
|
+
#'RDP-tcp://10.10.10.2:9000',
|
|
94
|
+
#'RDP-udp://10.10.10.2:138',
|
|
95
|
+
#'RDP+ntlm-password://domain\\user@10.10.10.2',
|
|
96
|
+
#'RDP-tcp+ntlm-password://domain\\user:password@10.10.10.2',
|
|
97
|
+
#'RDP-tcp+ntlm-password://domain\\user:password@10.10.10.2:10000',
|
|
98
|
+
#'RDP-tcp+ntlm-nt://domain\\user:alma@10.10.10.2',
|
|
99
|
+
#'RDP+ntlm-nt://domain\\user:alma@10.10.10.2',
|
|
100
|
+
#'RDP+ntlm-nt://domain\\user:alma@10.10.10.2',
|
|
101
|
+
#'RDP-tcp+kerberos-password://domain\\alma:password@10.10.10.10.2',
|
|
102
|
+
#'RDP-tcp+kerberos-aes://domain\\alma:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@10.10.10.10.2',
|
|
103
|
+
#'RDP-tcp+kerberos-aes://domain\\alma:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@10.10.10.10.2',
|
|
104
|
+
#'RDP-tcp+kerberos-nt://domain\\alma:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@10.10.10.10.2',
|
|
105
|
+
#'RDP-tcp+kerberos-rc4://domain\\alma:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@10.10.10.10.2',
|
|
106
|
+
#'RDP+sspi://10.10.10.10.2',
|
|
107
|
+
#'RDP+sspi-ntlm://10.10.10.10.2',
|
|
108
|
+
#'RDP+sspi-kerberos://10.10.10.10.2',
|
|
109
|
+
#'RDP+multiplexor://10.10.10.10.2',
|
|
110
|
+
#'RDP+multiplexor-ssl://10.10.10.10.2',
|
|
111
|
+
#'RDP+multiplexor-ssl-ntlm://10.10.10.10.2',
|
|
112
|
+
#'RDP+multiplexor-ssl-kerberos://10.10.10.10.2',
|
|
113
|
+
#'RDP://10.10.10.2/?timeout=10',
|
|
114
|
+
#'RDP://10.10.10.2/?timeout=10&dc=10.10.10.2',
|
|
115
|
+
#'RDP://10.10.10.2/?timeout=10&dc=10.10.10.2&proxytype=socks5',
|
|
116
|
+
#'RDP://10.10.10.2/?timeout=10&dc=10.10.10.2&proxytype=socks5&proxyserver=127.0.0.1',
|
|
117
|
+
#'RDP://10.10.10.2/?timeout=10&dc=10.10.10.2&proxytype=socks5&proxyserver=127.0.0.1&proxyuser=admin&proxypass=alma',
|
|
118
|
+
#'RDP://10.10.10.2/?timeout=10&dc=10.10.10.2&proxytype=socks5&proxyserver=127.0.0.1&proxyuser=admin&proxypass=alma&dc=10.10.10.2&dns=8.8.8.8',
|
|
119
|
+
#'RDP://10.10.10.2/?timeout=10&dc=10.10.10.2&proxytype=socks5-ssl&proxyserver=127.0.0.1&proxyuser=admin&proxypass=alma&dc=10.10.10.2&dns=8.8.8.8',
|
|
120
|
+
#'RDP://10.10.10.2/?timeout=10&dc=10.10.10.2&proxytype=multiplexor&proxyserver=127.0.0.1',
|
|
121
|
+
#'RDP://10.10.10.2/?timeout=10&dc=10.10.10.2&proxytype=multiplexor&proxyserver=127.0.0.1&proxyagentid=alma',
|
|
122
|
+
#'RDP://10.10.10.2/?timeout=10&dc=10.10.10.2&proxytype=multiplexor&proxyserver=127.0.0.1&proxyagentid=alma&proxytimeout=111',
|
|
123
|
+
'RDP://10.10.10.2/C$/test/tst111.dmp?timeout=10&dc=10.10.10.2&proxytype=multiplexor&proxyhost=127.0.0.1&proxyport=1&proxyagentid=alma&proxytimeout=111',
|
|
124
|
+
|
|
125
|
+
]
|
|
126
|
+
for url in url_tests:
|
|
127
|
+
print('===========================================================================')
|
|
128
|
+
print(url)
|
|
129
|
+
try:
|
|
130
|
+
dec = RDPConnectionFactory.from_url(url)
|
|
131
|
+
creds = dec.get_credential()
|
|
132
|
+
target = dec.get_target()
|
|
133
|
+
RDPfile = dec.get_file()
|
|
134
|
+
print(RDPfile)
|
|
135
|
+
except Exception as e:
|
|
136
|
+
import traceback
|
|
137
|
+
traceback.print_exc()
|
|
138
|
+
print('ERROR! Reason: %s' % e)
|
|
139
|
+
input()
|
|
140
|
+
else:
|
|
141
|
+
print(str(creds))
|
|
142
|
+
print(str(target))
|
|
143
|
+
input()
|
|
144
|
+
|
|
145
|
+
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
from aardwolf.extensions.RDPECLIP.channel import RDPECLIPChannel
|
|
2
|
+
from aardwolf.protocol.x224.constants import SUPP_PROTOCOLS, NEG_FLAGS
|
|
3
|
+
from aardwolf.commons.queuedata.constants import VIDEO_FORMAT
|
|
4
|
+
from aardwolf.protocol.T125.extendedinfopacket import PERF
|
|
5
|
+
from aardwolf.extensions.RDPEDYC.channel import RDPEDYCChannel
|
|
6
|
+
|
|
7
|
+
from aardwolf.extensions.RDPEDYC.vchannels.echo import VchannelECHO
|
|
8
|
+
#from aardwolf.extensions.RDPEDYC.vchannels.test import VchannelTEST
|
|
9
|
+
|
|
10
|
+
class RDPIOSettings:
|
|
11
|
+
def __init__(self):
|
|
12
|
+
# RDP only settings
|
|
13
|
+
# Which channels should be enabled
|
|
14
|
+
self.channels = [RDPECLIPChannel, RDPEDYCChannel]
|
|
15
|
+
self.vchannels = {
|
|
16
|
+
'ECHO' : VchannelECHO(),
|
|
17
|
+
#'DATATEST1' : VchannelTEST(),
|
|
18
|
+
}
|
|
19
|
+
# Authentication protocols supported
|
|
20
|
+
self.supported_protocols = None # supported_protocols if None: it will be determined automatically. otherwise select one or more from these SUPP_PROTOCOLS.RDP | SUPP_PROTOCOLS.SSL |SUPP_PROTOCOLS.HYBRID_EX
|
|
21
|
+
|
|
22
|
+
# Video settings used by both RDP and VNC
|
|
23
|
+
self.video_width = 1024
|
|
24
|
+
self.video_height = 768
|
|
25
|
+
self.video_out_format = VIDEO_FORMAT.QT5 # the recatngle image format which will be sent via the queue
|
|
26
|
+
|
|
27
|
+
# Video settings used only by RDP
|
|
28
|
+
# minimum supported BPP
|
|
29
|
+
self.video_bpp_min = 16
|
|
30
|
+
# maximum supported BPP
|
|
31
|
+
self.video_bpp_max = 16 #max supported bpp
|
|
32
|
+
# all supported BPPs
|
|
33
|
+
self.video_bpp_supported = [15, 16, 24, 32]
|
|
34
|
+
|
|
35
|
+
#Performance booster flags
|
|
36
|
+
self.performance_flags = PERF.DISABLE_WALLPAPER | PERF.DISABLE_THEMING | PERF.DISABLE_CURSORSETTINGS | PERF.DISABLE_MENUANIMATIONS | PERF.DISABLE_FULLWINDOWDRAG
|
|
37
|
+
|
|
38
|
+
# Keyboard settings
|
|
39
|
+
# Keyborad settings used by both RDP and VNC
|
|
40
|
+
# clinet_keyboard is used by VNC where the keyboard state must be virtualized client-side
|
|
41
|
+
self.client_keyboard = 'enus'
|
|
42
|
+
|
|
43
|
+
# Keyboard setting used only by RDP
|
|
44
|
+
# TODO: this should be cleaned up
|
|
45
|
+
self.keyboard_layout = 1033
|
|
46
|
+
self.keyboard_type = 4
|
|
47
|
+
self.keyboard_subtype = 0
|
|
48
|
+
self.keyboard_functionkey = 12
|
|
49
|
+
|
|
50
|
+
# Clipboard settings
|
|
51
|
+
|
|
52
|
+
# pyperclip is currently the only somewhat working cross-platform clipboard manager
|
|
53
|
+
# disabling it means that clipboard messages will only be dispatched via the external queue
|
|
54
|
+
# but the client's clipboard will not be updated
|
|
55
|
+
self.clipboard_use_pyperclip = True
|
|
56
|
+
|
|
57
|
+
# store all incloing clipboard data recieved from server. Text only
|
|
58
|
+
# set it to true to have a file created, or to a string with a file path
|
|
59
|
+
#
|
|
60
|
+
self.clipboard_store_data = None
|
|
61
|
+
|
|
62
|
+
# determines how often the client polls for desktop changes
|
|
63
|
+
self.vnc_fps = 10
|
|
64
|
+
|
|
65
|
+
# determines what type of encoding the client supports.
|
|
66
|
+
# Feel free to change the order of these but not the value.
|
|
67
|
+
# Each value corresponds to an encoding type and only these three anre implemented currently.
|
|
68
|
+
# The order signifies the preference to the server but the server can decide to ignore it
|
|
69
|
+
self.vnc_encodings = [2, 1, 0]
|
|
70
|
+
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
|
|
2
|
+
from aardwolf.commons.connection.url import RDPConnectionURL
|
|
3
|
+
from aardwolf.commons.connection.credential import RDPCredentialTypes
|
|
4
|
+
|
|
5
|
+
RDP_CONNECTION_PARAM_MANDATORY = ['domain','user','password','auth_type', 'timeout', 'protocol']
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class RDPConnectionParams:
|
|
9
|
+
def __init__(self):
|
|
10
|
+
pass
|
|
11
|
+
|
|
12
|
+
@staticmethod
|
|
13
|
+
def extend_parser(parser):
|
|
14
|
+
group = parser.add_argument_group('Parameter based connection')
|
|
15
|
+
group.add_argument('-d', '--domain', default='.', help='Domainname')
|
|
16
|
+
group.add_argument('-u', '--user', help='Username')
|
|
17
|
+
group.add_argument('-p', '--password', help='Password (or other secret for authentication)')
|
|
18
|
+
group.add_argument('-a', '--auth-type', choices=[e.value for e in RDPCredentialTypes], default='ntlm-password', help='authentication type')
|
|
19
|
+
group.add_argument('-t', '--timeout', type=int, default=5, help='Connection timeout')
|
|
20
|
+
group.add_argument('--protocol', choices=['RDP', 'RDP2', 'RDP3'], default='RDP2', help='RDP protocol version')
|
|
21
|
+
group.add_argument('--dc', help='DC ip for kerberos')
|
|
22
|
+
|
|
23
|
+
@staticmethod
|
|
24
|
+
def parse_args(args):
|
|
25
|
+
for p in RDP_CONNECTION_PARAM_MANDATORY:
|
|
26
|
+
if hasattr(args, p) is False:
|
|
27
|
+
raise Exception('The parameter "%s" is mandatory for parameter based connection setup!' % p)
|
|
28
|
+
if getattr(args, p) is None:
|
|
29
|
+
raise Exception('The parameter "%s" cannot be empty!' % p)
|
|
30
|
+
|
|
31
|
+
url_template = '{protocol}+{auth_type}://{domainname}\\{username}:{password}@{host}/'
|
|
32
|
+
params = {
|
|
33
|
+
'protocol' : args.protocol,
|
|
34
|
+
'auth_type' : args.auth_type,
|
|
35
|
+
'domainname': args.domain,
|
|
36
|
+
'username' : args.user,
|
|
37
|
+
'password' : args.password,
|
|
38
|
+
'host' : args.host if hasattr(args, 'host') else None,
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
url = url_template.format(**params)
|
|
42
|
+
print(url)
|
|
43
|
+
return url
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
if __name__ == '__main__':
|
|
47
|
+
import argparse
|
|
48
|
+
parser = argparse.ArgumentParser(prog='TEST')
|
|
49
|
+
|
|
50
|
+
RDPConnectionParams.extend_parser(parser)
|
|
51
|
+
|
|
52
|
+
print(parser)
|
|
53
|
+
|
|
54
|
+
args = parser.parse_args()
|
|
55
|
+
|
|
56
|
+
RDPConnectionParams.parse_args(args)
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import enum
|
|
2
|
+
|
|
3
|
+
class RDPDATATYPE(enum.Enum):
|
|
4
|
+
VIDEO = "VIDEO"
|
|
5
|
+
KEYSCAN = 'KEYSCAN'
|
|
6
|
+
KEYUNICODE = 'KEYUNICODE'
|
|
7
|
+
MOUSE = 'MOUSE'
|
|
8
|
+
CLIPBOARD_READY = 'CLIPBOARD_READY'
|
|
9
|
+
CLIPBOARD_DATA_TXT = 'CLIPBOARD_DATA_TXT'
|
|
10
|
+
CLIPBOARD_CONSUMED = 'CLIPBOARD_CONSUMED'
|
|
11
|
+
CLIPBOARD_NEW_DATA_AVAILABLE = 'CLIPBOARD_NEW_DATA_AVAILABLE'
|
|
12
|
+
BEEP = 'BEEP'
|
|
13
|
+
|
|
14
|
+
from aardwolf.commons.queuedata.video import RDP_VIDEO
|
|
15
|
+
from aardwolf.commons.queuedata.keyboard import RDP_KEYBOARD_SCANCODE, RDP_KEYBOARD_UNICODE
|
|
16
|
+
from aardwolf.commons.queuedata.mouse import RDP_MOUSE
|
|
17
|
+
from aardwolf.commons.queuedata.clipboard import RDP_CLIPBOARD_READY, RDP_CLIPBOARD_DATA_TXT, RDP_CLIPBOARD_CONSUMED, RDP_CLIPBOARD_NEW_DATA_AVAILABLE
|
|
18
|
+
from aardwolf.commons.queuedata.beep import RDP_BEEP
|
|
19
|
+
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import enum
|
|
2
|
+
from aardwolf.commons.queuedata import RDPDATATYPE
|
|
3
|
+
|
|
4
|
+
class RDP_BEEP:
|
|
5
|
+
"""
|
|
6
|
+
This object will be dispatched on the external queue
|
|
7
|
+
when the server sends a Beep or Bell notification
|
|
8
|
+
"""
|
|
9
|
+
def __init__(self):
|
|
10
|
+
self.type = RDPDATATYPE.BEEP
|
|
11
|
+
def __repr__(self):
|
|
12
|
+
t = '==== RDP_BEEP ====\r\n'
|
|
13
|
+
for k in self.__dict__:
|
|
14
|
+
if isinstance(self.__dict__[k], enum.IntFlag):
|
|
15
|
+
value = self.__dict__[k]
|
|
16
|
+
elif isinstance(self.__dict__[k], enum.Enum):
|
|
17
|
+
value = self.__dict__[k].name
|
|
18
|
+
else:
|
|
19
|
+
value = self.__dict__[k]
|
|
20
|
+
t += '%s: %s\r\n' % (k, value)
|
|
21
|
+
return t
|