orb.py 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-"
  3. """
  4. This file is part of the orb project, https://orb.03c8.net
  5. Orb - 2016/2017/2018 - by psy (epsylon@riseup.net)
  6. You should have received a copy of the GNU General Public License along
  7. with RedSquat; if not, write to the Free Software Foundation, Inc., 51
  8. Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  9. """
  10. import socket, threading, re, base64, os, datetime
  11. import webbrowser, subprocess, urllib, json, sys
  12. from options import OrbOptions
  13. from pprint import pprint
  14. host = "0.0.0.0"
  15. port = 9999
  16. class ClientThread(threading.Thread):
  17. def __init__(self, ip, port, socket):
  18. threading.Thread.__init__(self)
  19. self.ip = ip
  20. self.port = port
  21. self.socket = socket
  22. self.pages = Pages()
  23. def run(self):
  24. req = self.socket.recv(2048)
  25. res = self.pages.get(req)
  26. out = "HTTP/1.0 %s\r\n" % res["code"]
  27. out += "Content-Type: %s\r\n\r\n" % res["ctype"]
  28. out += "%s" % res["html"]
  29. self.socket.send(out)
  30. self.socket.close()
  31. if "run" in res and len(res["run"]):
  32. subprocess.Popen(res["run"], shell=True)
  33. class Pages():
  34. def __init__(self):
  35. self.options = OrbOptions()
  36. self.pages = {}
  37. self.pages["/header"] = """
  38. <!DOCTYPE html><html>
  39. <head>
  40. <link rel="icon" type="image/png" href="/favicon.ico" />
  41. <meta name="author" content="psy">
  42. <meta name="robots" content="noindex, nofollow">
  43. <meta http-equiv="content-type" content="text/xml; charset=utf-8" />
  44. <title>Orb - footprinting tool</title>
  45. <script language="javascript" src="/lib.js"></script>
  46. """
  47. self.pages["/footer"] = """</body>
  48. </html>
  49. """
  50. self.pages["/favicon.ico"] = base64.b64decode("AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQIDA6sBX9r/AWrk/wFn4f8BXdb/AzR/5AAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYgKY/f8BRbL/ASBR/wEKFP8BCRH/ARtD/wE9pP8DnP3/AQAAjwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZgFz6/8BM4z/AR1F/wEPH/8BBgv/AQMF/wELGf8BGTv/ATCA/wFm4v8EHkG7AAAAAAAAAAAAAAAAAAAABwF98f8BMYH/ARtD/wIMGv8DBQj/AwYK/wQHC/8DBgn/AgoU/wEYOf8BMH3/AWXh/wAAACUAAAAAAAAAAAFRx/4BMoX/ARxF/wINGv8DBgv/CRAY/w8ZKf8QGyv/ChMd/wQJD/8CCxX/ARpA/wEvfP8BUcb/AAAAAAAAAAABUMj/AR9L/wESJf8DCA//CRAY/xkwTf8uWpT/MWCd/x86X/8MFSH/BAkP/wERJP8BHUb/AT+k/wAAAAEAAAABASVe/wEVMv8BChb/BAgO/xIgMv81aKf/ZLzt/2vE8/9BgsL/FyxG/wYMEv8CCxX/ARUx/wEfTP8AAAAWAAAAAgEWNP8BDx3/AgkQ/wUJDv8VJz3/QYLC/33U+v+G2/3/UJ7Z/x02V/8IDRX/AggQ/wEPIP8BFCv/AAEBHQAAAAABDBr/AQwZ/wEHDf8EBwv/EB0s/y5Zk/9VqOH/XLHn/zhvr/8VJj3/BgsR/wIGDP8BChP/ARQw/wAAAAQAAAAAAQwY/wESJf8BBAj/AwQH/wcNE/8UJDn/I0Nt/yVHdf8XLEb/ChEZ/wMGCf8BBQj/AQsY/wEHDP8AAAAAAAAAAAISI4EBQq3/AQUI/wEDA/8CAwX/BQoP/woRGf8KEhv/BgwR/wMEB/8CAwT/AQME/wEwgv8BCxX/AAAAAAAAAAAAAAAAAUrA/wEqbf8BAQL/AAEB/wECA/8CAwT/AgME/wIDA/8AAQH/AAAA/wEdSf8EgfL/AAAAAAAAAAAAAAAAAAAAAAAAAABA4/3/AUzA/wEHDf8AAAD/AAAA/wAAAP8AAAD/AQQH/wE6n/9c6v3/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADiz8f97/f//AZL8/wFRyP8BTsP/AYX1/172//9dzfn/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGrK/Gml5///s+r//2/R+9MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+B8AAPAHAADgAwAAwAMAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAADAAwAA4AcAAPAPAAD+PwAA//8AAA==")
  51. self.pages["/"] = self.pages["/header"] + """<script language="javascript">function Start(){
  52. target=document.getElementById("target").value
  53. String.prototype.startsWith = function(prefix){
  54. return this.indexOf(prefix) === 0;
  55. }
  56. if(target!=""){
  57. if (document.getElementById("massive").checked){
  58. document.getElementById("massive").value = "on";
  59. } else {
  60. document.getElementById("massive").value = "off";
  61. }
  62. massive = document.getElementById("massive").value
  63. extens =document.getElementById("extens").value
  64. engineloc=document.getElementById("engineloc").value
  65. if (document.getElementById("json").checked){
  66. document.getElementById("json").value = "on";
  67. } else {
  68. document.getElementById("json").value = "off";
  69. }
  70. json = document.getElementById("json").value
  71. if (document.getElementById("nopublic").checked){
  72. document.getElementById("nopublic").value = "on";
  73. } else {
  74. document.getElementById("nopublic").value = "off";
  75. }
  76. nopublic = document.getElementById("nopublic").value
  77. if (document.getElementById("nowhois").checked){
  78. document.getElementById("nowhois").value = "on";
  79. } else {
  80. document.getElementById("nowhois").value = "off";
  81. }
  82. nowhois = document.getElementById("nowhois").value
  83. if (document.getElementById("nosubs").checked){
  84. document.getElementById("nosubs").value = "on";
  85. } else {
  86. document.getElementById("nosubs").value = "off";
  87. }
  88. nosubs = document.getElementById("nosubs").value
  89. if (document.getElementById("nodns").checked){
  90. document.getElementById("nodns").value = "on";
  91. } else {
  92. document.getElementById("nodns").value = "off";
  93. }
  94. nodns = document.getElementById("nodns").value
  95. if (document.getElementById("noscanner").checked){
  96. document.getElementById("noscanner").value = "on";
  97. } else {
  98. document.getElementById("noscanner").value = "off";
  99. }
  100. noscanner = document.getElementById("noscanner").value
  101. if (document.getElementById("noscandns").checked){
  102. document.getElementById("noscandns").value = "on";
  103. } else {
  104. document.getElementById("noscandns").value = "off";
  105. }
  106. noscandns = document.getElementById("noscandns").value
  107. if (document.getElementById("noscanns").checked){
  108. document.getElementById("noscanns").value = "on";
  109. } else {
  110. document.getElementById("noscanns").value = "off";
  111. }
  112. noscanns = document.getElementById("noscanns").value
  113. if (document.getElementById("noscanmx").checked){
  114. document.getElementById("noscanmx").value = "on";
  115. } else {
  116. document.getElementById("noscanmx").value = "off";
  117. }
  118. noscanmx = document.getElementById("noscanmx").value
  119. scanports =document.getElementById("scanports").value
  120. if (document.getElementById("onlytcp").checked){
  121. document.getElementById("onlytcp").value = "on";
  122. } else {
  123. document.getElementById("onlytcp").value = "off";
  124. }
  125. onlytcp = document.getElementById("onlytcp").value
  126. if (document.getElementById("nobanner").checked){
  127. document.getElementById("nobanner").value = "on";
  128. } else {
  129. document.getElementById("nobanner").value = "off";
  130. }
  131. nobanner = document.getElementById("nobanner").value
  132. if (document.getElementById("cve").checked){
  133. document.getElementById("cve").value = "on";
  134. } else {
  135. document.getElementById("cve").value = "off";
  136. }
  137. cve = document.getElementById("cve").value
  138. if (document.getElementById("cvs").checked){
  139. document.getElementById("cvs").value = "on";
  140. } else {
  141. document.getElementById("cvs").value = "off";
  142. }
  143. cvs = document.getElementById("cvs").value
  144. params="target="+escape(target)+"&massive="+escape(massive)+"&extens="+escape(extens)+"&engineloc="+escape(engineloc)+"&nopublic="+escape(nopublic)+"&nowhois="+escape(nowhois)+"&nosubs="+escape(nosubs)+"&nodns="+escape(nodns)+"&noscanner="+escape(noscanner)+"&noscandns="+escape(noscandns)+"&noscanns="+escape(noscanns)+"&noscanmx="+escape(noscanmx)+"&scanports="+escape(scanports)+"&onlytcp="+escape(onlytcp)+"&nobanner="+escape(nobanner)+"&cve="+escape(cve)+"&cvs="+escape(cvs)+"&json="+escape(json)
  145. }else{
  146. window.alert("You need to enter something... (ex: dell)");
  147. return
  148. }
  149. runCommandX("cmd_spell", params)
  150. }
  151. </script><script>loadXMLDoc()</script><script type='text/javascript'>var index = 0;var text = 'Welcome to... Orb !!!';function type(){document.getElementById('screen').innerHTML += text.charAt(index);index += 1;var t = setTimeout('type()',120);}</script><script type='text/javascript'>
  152. function show(one) {
  153. var nb = document.getElementsByTagName("div");
  154. for(var x=0; x<nb.length; x++) {
  155. name = nb[x].getAttribute("class");
  156. if (name == 'nb') {
  157. if (nb[x].id == one) {
  158. nb[x].style.display = 'block';
  159. }
  160. else {
  161. nb[x].style.display = 'none';
  162. }
  163. }
  164. }
  165. }
  166. </script><script type='text/javascript'>
  167. function checkNobanner(){
  168. if (document.getElementById("nobanner").checked == true){
  169. document.getElementById("cve").checked = true;
  170. document.getElementById("cvs").checked = true;
  171. }}
  172. </script><script type='text/javascript'>
  173. function checkNoscanner(){
  174. if (document.getElementById("noscanner").checked == true){
  175. document.getElementById("noscandns").checked = true;
  176. document.getElementById("noscanns").checked = true;
  177. document.getElementById("noscanmx").checked = true;
  178. }}
  179. </script><script type='text/javascript'>
  180. function checkBoth(){
  181. if (document.getElementById("both").checked == true){
  182. document.getElementById("noscanner").checked = false;
  183. document.getElementById("nobanner").checked = false;
  184. document.getElementById("cve").checked = false;
  185. document.getElementById("cvs").checked = false;
  186. document.getElementById("nodns").checked = false;
  187. document.getElementById("noscandns").checked = false;
  188. document.getElementById("noscanns").checked = false;
  189. document.getElementById("noscanmx").checked = false;
  190. document.getElementById("nopublic").checked = false;
  191. document.getElementById("nowhois").checked = false;
  192. document.getElementById("nosubs").checked = false;
  193. }}
  194. </script><script type='text/javascript'>
  195. function checkPassive(){
  196. if (document.getElementById("passive").checked == true){
  197. document.getElementById("noscanner").checked = true;
  198. document.getElementById("nobanner").checked = true;
  199. document.getElementById("cve").checked = true;
  200. document.getElementById("cvs").checked = true;
  201. document.getElementById("nodns").checked = true;
  202. document.getElementById("noscandns").checked = true;
  203. document.getElementById("noscanns").checked = true;
  204. document.getElementById("noscanmx").checked = true;
  205. document.getElementById("nopublic").checked = false;
  206. document.getElementById("nowhois").checked = false;
  207. document.getElementById("nosubs").checked = false;
  208. }}
  209. </script><script type='text/javascript'>
  210. function checkActive(){
  211. if (document.getElementById("active").checked == true){
  212. document.getElementById("nopublic").checked = true;
  213. document.getElementById("nowhois").checked = true;
  214. document.getElementById("nosubs").checked = true;
  215. document.getElementById("noscanner").checked = false;
  216. document.getElementById("noscandns").checked = false;
  217. document.getElementById("noscanns").checked = false;
  218. document.getElementById("noscanmx").checked = false;
  219. document.getElementById("nobanner").checked = false;
  220. document.getElementById("cve").checked = false;
  221. document.getElementById("cvs").checked = false;
  222. document.getElementById("nodns").checked = false;
  223. }}
  224. </script>
  225. </head>
  226. <body onload='type()' bgcolor="black" text="orange" style="monospace;" ><center><table><tr><td><pre>
  227. #Y
  228. U#@#%$
  229. ...........
  230. ....................
  231. ...,,,,,,,,,,,,,,,,,,,....
  232. ..,,,,,,,,,,,,,,,,,,,,,,,,,,...
  233. ..,,,,,,,,,,,,,,,,,,,,,,,...,,,,,,..
  234. .,,,,,,,,,,.........................,,,,.
  235. .,,,,............................... ..,*,
  236. .,,,................................... .,*/.
  237. .,,.................................... ./#(.
  238. .,...................................... .(#(.
  239. .,,................................... .*#/.
  240. .*,................................. *#(
  241. ,/,............................... .(#,
  242. .#/,............................. *#((
  243. .#/,............................. **/(.
  244. (/*........................... .*///
  245. /(*......................... .,**/*
  246. ,((,........................ ,,*//.
  247. ((*...................... .,,*/*
  248. .*(,..................... ,,,*,.
  249. //*................... ..,,,,
  250. /(, ............. .,,,,,
  251. .**. ............... ...,,,,.
  252. ,*, ............... ....,,,,,
  253. **, ............................,,,,.
  254. ,*(#(/,. .......................,,,*###/,
  255. ./##(((((/*,,..................,,,,/((((((//,
  256. **,*%%%((((#(/***,,,,,,,,,,,,,,*(###((###((#/
  257. .#%%%%%%%#((((*******,,,,,,,,,,,,/(((((#%&%%%#.
  258. ./##%/*,/((***, ..,.... ./(/(#(,,*(#/
  259. .,,,.,**/(%#(, .**///*.,,.
  260. .,,,*,. ,***, .*,,,..
  261. .,*/*. .,*,,.
  262. ,#(/,,, .,*(#(,
  263. </pre></td><td><table border="1" cellpadding="10" cellspacing="10"><tr><td> <div><a id="mH1" href="javascript:show('nb1');" style="text-decoration: none;" >+ Info</a></div>
  264. <div><a id="mH2" href="javascript:show('nb2');" style="text-decoration: none;" >+ Contact</a></div>
  265. </td><td><i><h3><div id='screen'></div></h3></i><div class="nb" id="nb1" style="display: none;"><pre>This is a massive <a href="https://en.wikipedia.org/wiki/Footprinting" target="_blank">footprinting</a> tool. It will
  266. use <u>automated</u> gathering methods to provides
  267. you information about a target.
  268. <a href="https://orb.03c8.net" target="_blank">Website</a> | <a href="https://github.com/epsylon/orb" target="_blank">Code</a> | <a href="https://twitter.com/search?q=%23orb-pentest" target="_blank">Social Tag</a>
  269. ---------
  270. <div><a id="mH0" href="javascript:show('nb0');" style="text-decoration: none;" >Close()</a></div><div class="nb" id="nb0" style="display: none;"></div></pre></div><div class="nb" id="nb2" style="display: none;"><pre>If you want to contribute to development,
  271. reporting a bug, providing a patch,
  272. commenting on the code, making a donation
  273. or simply need to find help to run it,
  274. please drop me an <a href="mailto:epsylon@riseup.net">e-mail</a>.
  275. ---------
  276. <div><a id="mH0" href="javascript:show('nb0');" style="text-decoration: none;" >Close()</a></div><div class="nb" id="nb0" style="display: none;"></div></pre></div></td></tr></table><br />
  277. <form method='GET'><fieldset><table border="0" cellpadding="5" cellspacing="5"><tr><td> TLD extension(s):</td><td><input type="text" id="extens" name="extens" size="20" value=".com,.net" title="set extensions manually (ex: '.com,.net,.es')"></td></tr></table><br /><table border="1" cellpadding="5" cellspacing="5"><tr><td> Methods:</td><td><input type="radio" name="method" title="use both -active/passive- methods" id="both" value="both" onclick="checkBoth()" checked> Both</td><td><input type="radio" name="method" title="use ONLY -passive- methods" id="passive" value="passive" onclick="checkPassive()"> Passive</td><td><input type="radio" name="method" title="use ONLY -active- methods" id="active" value="active" onclick="checkActive()"> Active</td></tr></table><br><table border="1" cellpadding="5" cellspacing="5"><tr><td>Extra:</td><td><div><a id="mH3" href="javascript:show('nb3');" style="text-decoration: none;" >+ Config</a></div></td><td><input type="checkbox" id="autoscrolling" title="active auto-scrolling"/> Auto-Scroll</td><td><input type="checkbox" id="json" title="generate json report"/> Json</td></tr></table><br><table><tr><td>TARGET: <input type="text" name="target" id="target" size="26" placeholder="microsoft, facebook ..." title="start complete footprinting on this target" required></td></tr></table><br><div class="nb" id="nb3" style="display: none;"><table border="1" cellpadding="5" cellspacing="5"><tr><td><input type="checkbox" id="nopublic" name="nopublic" title="disable search for public records"/> No-Public</td><td>Engine loc: <input type="text" id="engineloc" name="engineloc" size="2" title="set location for search engine (ex: 'fr')"></td><td><input type="checkbox" id="massive" name="massive" title="search massively using all search engines (default: Yahoo)" checked/> Massive</td></tr><tr><td><input type="checkbox" id="nowhois" name="nowhois" title="disable extract whois information"/> No-Whois</td><td><input type="checkbox" id="nosubs" name="nosubs" title="disable try to discover subdomains"/> No-Subs</td><td><input type="checkbox" id="nodns" name="nodns" title="disable try to discover DNS records"/> No-DNS</td></tr><tr><td><input type="checkbox" id="noscanner" name="noscanner" title="disable scanner" onclick="checkNoscanner()"/> No-Scanner</td><td>Ports: <input type="text" size="6" id="scanports" name="scanports" value="1-65535" title="set range of ports to scan"></td><td><input type="checkbox" name="onlytcp" id="onlytcp" title="set scanning protocol to only TCP"/> Only-TCP</td></tr><td><input type="checkbox" id="noscandns" name="noscandns" title="disable scan DNS machines"/> No-Scan-DNS</td><td><input type="checkbox" id="noscanns" name="noscanns" title="disable scan NS records"/> No-Scan-NS</td><td><input type="checkbox" id="noscanmx" name="noscanmx" title="disable scan MX records"/> No-Scan-MX</td></tr><tr><td><input type="checkbox" id="nobanner" name="nobanner" title="disable extract banners from services" onclick="checkNobanner()"/> No-Banner</td><td><input type="checkbox" id="cve" name="cve" title="disable extract vulnerabilities from CVE"/> No-CVE</td><td><input type="checkbox" id="cvs" name="cvs" title="disable extract CVS description"/> No-CVS</td></tr></table><div><a id="mH0" href="javascript:show('nb0');" style="text-decoration: none;" ><pre>Close()</pre></a></div><div class="nb" id="nb0" style="display: none;"></div></div></td></tr></table></fieldset></form><button title="Nihil Sine Chaos!!" onClick=Start()>Spell!</button><hr></center><div id="cmdOut"></div>""" + self.pages["/footer"]
  278. self.pages["/lib.js"] = """function loadXMLDoc() {
  279. var xmlhttp;
  280. if (window.XMLHttpRequest) {
  281. // code for IE7+, Firefox, Chrome, Opera, Safari
  282. xmlhttp = new XMLHttpRequest();
  283. } else {
  284. // code for IE6, IE5
  285. xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
  286. }
  287. xmlhttp.onreadystatechange = function() {
  288. if (xmlhttp.readyState == 4 ) {
  289. if(xmlhttp.status == 200){
  290. document.getElementById("cmdOut").innerHTML = xmlhttp.responseText;
  291. setTimeout("loadXMLDoc()", 3000);
  292. }
  293. }
  294. }
  295. xmlhttp.send();
  296. }
  297. function runCommandX(cmd,params) {
  298. var xmlhttp;
  299. if (window.XMLHttpRequest) {
  300. // code for IE7+, Firefox, Chrome, Opera, Safari
  301. xmlhttp = new XMLHttpRequest();
  302. } else {
  303. // code for IE6, IE5
  304. xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
  305. }
  306. xmlhttp.onreadystatechange = function() {
  307. if (xmlhttp.readyState == 4 ) {
  308. if(xmlhttp.status == 200){
  309. if(cmd.indexOf("?")!=-1){
  310. s=cmd.split("?")
  311. cmd=s[0]
  312. params=s[1]
  313. }
  314. document.getElementById("cmdOut").innerHTML = xmlhttp.responseText;
  315. if (document.getElementById("autoscrolling").checked){
  316. document.getElementById("cmdOut").scrollIntoView();
  317. }
  318. newcmd=cmd
  319. if(newcmd=="cmd_null"){
  320. return;
  321. } else {
  322. if(newcmd=="cmd_spell") newcmd=newcmd+"_update"
  323. setTimeout(function(){runCommandX(newcmd,params)}, 3000);
  324. return;}
  325. }
  326. }
  327. }
  328. if(typeof params != "undefined") cmd=cmd+"?"+params
  329. xmlhttp.open("GET", cmd, true);
  330. xmlhttp.send();
  331. }
  332. """
  333. def buildGetParams(self, request):
  334. params = {}
  335. path = re.findall("^GET ([^\s]+)", request)
  336. if path:
  337. path = path[0]
  338. start = path.find("?")
  339. if start != -1:
  340. for param in path[start+1:].split("&"):
  341. f = param.split("=")
  342. if len(f) == 2:
  343. var = f[0]
  344. value = f[1]
  345. value = value.replace("+", " ")
  346. value = urllib.unquote(value)
  347. params[var] = value
  348. return params
  349. def get(self, request):
  350. cmd_options = ""
  351. runcmd = ""
  352. res = re.findall("^GET ([^\s]+)", request)
  353. if res is None or len(res)==0:
  354. return
  355. pGet = {}
  356. page = res[0]
  357. paramStart = page.find("?")
  358. if paramStart != -1:
  359. page = page[:paramStart]
  360. pGet = self.buildGetParams(request)
  361. if page == "/cmd_spell":
  362. self.pages["/cmd_spell"] = "<pre>Waiting for 'orb' to return with data ...</pre>"
  363. if pGet["massive"] == "on": # --sa
  364. cmd_options+= " --sa"
  365. if pGet["extens"]: # --ext=
  366. cmd_options+= " --ext="+pGet["extens"]
  367. if pGet["engineloc"] != "": # --ext=
  368. cmd_options+= " --se-ext="+pGet["engineloc"]
  369. if pGet["json"] == "on": # --json=target_datetime.json
  370. namefile = pGet["target"] + ".json"
  371. cmd_options+= " --json="+str(namefile)
  372. if pGet["nopublic"] == "on": # --no-public
  373. cmd_options+= " --no-public"
  374. if pGet["nowhois"] == "on": # --no-whois
  375. cmd_options+= " --no-whois"
  376. if pGet["nosubs"] == "on": # --no-subs
  377. cmd_options+= " --no-subs"
  378. if pGet["nodns"] == "on": # --no-dns
  379. cmd_options+= " --no-dns"
  380. if pGet["noscanner"] == "on": # --no-scanner
  381. cmd_options+= " --no-scanner"
  382. if pGet["noscandns"] == "on": # --no-scan-dns
  383. cmd_options+= " --no-scan-dns"
  384. if pGet["noscanns"] == "on": # --no-scan-ns
  385. cmd_options+= " --no-scan-ns"
  386. if pGet["noscanmx"] == "on": # --no-scan-mx
  387. cmd_options+= " --no-scan-mx"
  388. if pGet["scanports"]: # --scan-ports=
  389. cmd_options+= " --scan-ports="+pGet["scanports"]
  390. if pGet["onlytcp"] == "on": # --scan-tcp
  391. cmd_options+= " --scan-tcp"
  392. if pGet["nobanner"] == "on": # --no-banner
  393. cmd_options+= " --no-banner"
  394. if pGet["cve"] == "on": # --no-cve
  395. cmd_options+= " --no-cve"
  396. if pGet["cvs"] == "on": # --no-cvs
  397. cmd_options+= " --no-cvs"
  398. runcmd = "(python -i orb --spell '"+pGet["target"]+"'"+ cmd_options + "|tee /tmp/out) &"
  399. if page == "/cmd_spell_update":
  400. if not os.path.exists('/tmp/out'):
  401. open('/tmp/out', 'w').close()
  402. with open('/tmp/out', 'r') as f:
  403. self.pages["/cmd_spell_update"] = "<pre>"+f.read()+"<pre>"
  404. ctype = "text/html"
  405. if page.find(".js") != -1:
  406. ctype = "application/javascript"
  407. elif page.find(".txt") != -1:
  408. ctype = "text/plain"
  409. elif page.find(".ico") != -1:
  410. ctype = "image/x-icon"
  411. elif page.find(".png") != -1:
  412. ctype = "image/png"
  413. if page in self.pages:
  414. return dict(run=runcmd, code="200 OK", html=self.pages[page], ctype=ctype)
  415. return dict(run=runcmd, code="404 Error", html="404 Error<br><br>Page not found...", ctype=ctype)
  416. class Command(object):
  417. def __init__(self, cmd):
  418. self.cmd = cmd
  419. self.process = None
  420. def run(self, timeout):
  421. def target():
  422. self.process = subprocess.Popen(self.cmd, shell=True)
  423. thread = threading.Thread(target=target)
  424. thread.start()
  425. thread.join(timeout)
  426. if thread.is_alive():
  427. self.process.terminate()
  428. thread.join()
  429. if __name__ == "__main__":
  430. webbrowser.open('http://127.0.0.1:9999', new=1)
  431. tcpsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  432. tcpsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  433. tcpsock.bind((host, port))
  434. while True:
  435. tcpsock.listen(4)
  436. (clientsock, (ip, c_port)) = tcpsock.accept()
  437. newthread = ClientThread(ip, c_port, clientsock)
  438. newthread.start()