PageRenderTime 47ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/pentest/misc/b4ltazar/darkb0t-v.0.1.py

https://bitbucket.org/flavio58-IT/attackvector-linux
Python | 349 lines | 316 code | 24 blank | 9 comment | 51 complexity | 89afacc95fba86297062ba0f40923613 MD5 | raw file
  1. #!/usr/bin/python
  2. # This was written for educational purpose and pentest only. Use it at your own risk.
  3. # Author will be not responsible for any damage!
  4. # !!! Special greetz for my friend sinner_01 !!!
  5. # Toolname : darkb0t.py
  6. # Coder : baltazar a.k.a b4ltazar < b4ltazar@gmail.com>
  7. # Version : 0.1
  8. # Greetz for rsauron and low1z, great python coders
  9. # greetz for d3hydr8, r45c4l, qk, fx0, Soul, MikiSoft, c0ax, b0ne and all members of ex darkc0de.com, ljuska.org & darkartists.info
  10. import sys, subprocess, socket, string, httplib, urlparse, urllib, re, urllib2, random, threading, cookielib
  11. from xml.dom.minidom import parse, parseString
  12. from time import sleep
  13. def logo():
  14. print "\n|---------------------------------------------------------------|"
  15. print "| b4ltazar[@]gmail[dot]com |"
  16. print "| 02/2012 darkb0t.py v.0.1 |"
  17. print "| darkartists.info & ljuska.org |"
  18. print "| |"
  19. print "|---------------------------------------------------------------|\n"
  20. def cmd():
  21. print "[!] Commands the bot understands: "
  22. print "\n[+] !help : Help"
  23. print "[+] !usage : Examples of usage"
  24. print "[+] !over : Bot quits"
  25. print "[+] !clear : Clearing the urls in array!"
  26. print "[+] !status : Show status of finished threads"
  27. print "[+] !reverse : List domains hosted on the same IP"
  28. print "[+] !srvinfo : Some info about target server"
  29. print "[+] !sub : Checking for subdomains"
  30. print "[+] !dork : Using dork for collecting links and then check for SQLi"
  31. if sys.platform == 'linux' or sys.platform == 'linux2':
  32. subprocess.call('clear', shell=True)
  33. logo()
  34. cmd()
  35. else:
  36. subprocess.call('cls', shell=True)
  37. logo()
  38. cmd()
  39. if len(sys.argv) != 5:
  40. print "[!] Usage: python darkb0t.py <host> <port> <nick> <channel>"
  41. print "[!] Exiting, thx for using script"
  42. sys.exit(1)
  43. subdomains = ['adm','admin','admins','agent','aix','alerts','av','antivirus','app','apps','appserver','archive','as400','auto','backup','banking','bbdd','bbs','bea','beta','blog','catalog','cgi','channel','channels','chat','cisco','client','clients','club','cluster','clusters','code','commerce','community','compaq','conole','consumer','contact','contracts','corporate','ceo','cso','cust','customer','cpanel','data','bd','db2','default','demo','design','desktop','dev','develop','developer','device','dial','digital','dir','directory','disc','discovery','disk','dns','dns1','dns2','dns3','docs','documents','domain','domains','dominoweb','download','downloads','ecommerce','e-commerce','edi','edu','education','email','enable','engine','engineer','enterprise','error','event','events','example','exchange','extern','external','extranet','fax','field','finance','firewall','forum','forums','fsp','ftp','ftp2','fw','fw1','gallery','galleries','games','gateway','gopher','guest','gw','hello','helloworld','help','helpdesk','helponline','hp','ibm','ibmdb','ids','ILMI','images','imap','imap4','img','imgs','info','intern','internal','intranet','invalid','iphone','ipsec','irc','ircserver','jobs','ldap','link','linux','lists','listserver','local','localhost','log','logs','login','lotus','mail','mailboxes','mailhost','management','manage','manager','map','maps','marketing','device','media','member','members','messenger','mngt','mobile','monitor','multimedia','music','my','names','net','netdata','netstats','network','news','nms','nntp','ns','ns1','ns2','ns3','ntp','online','openview','oracle','outlook','page','pages','partner','partners','pda','personal','ph','pictures','pix','pop','pop3','portal','press','print','printer','private','project','projects','proxy','public','ra','radio','raptor','ras','read','register','remote','report','reports','root','router','rwhois','sac','schedules','scotty','search','secret','secure','security','seri','serv','serv2','server','service','services','shop','shopping','site','sms','smtp','smtphost','snmp','snmpd','snort','solaris','solutions','support','source','sql','ssl','stats','store','stream','streaming','sun','support','switch','sysback','system','tech','terminal','test','testing','testing123','time','tivoli','training','transfers','uddi','update','upload','uploads','video','vpn','w1','w2','w3','wais','wap','web','webdocs','weblib','weblogic','webmail','webserver','webservices','websphere','whois','wireless','work','world','write','ws','ws1','ws2','ws3','www1','www2','www3']
  44. header = ['Mozilla/4.0 (compatible; MSIE 5.0; SunOS 5.10 sun4u; X11)',
  45. 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.2pre) Gecko/20100207 Ubuntu/9.04 (jaunty) Namoroka/3.6.2pre',
  46. 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Avant Browser;',
  47. 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)',
  48. 'Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.1)',
  49. 'Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.6)',
  50. 'Microsoft Internet Explorer/4.0b1 (Windows 95)',
  51. 'Opera/8.00 (Windows NT 5.1; U; en)',
  52. 'amaya/9.51 libwww/5.4.0',
  53. 'Mozilla/4.0 (compatible; MSIE 5.0; AOL 4.0; Windows 95; c_athome)',
  54. 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)',
  55. 'Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.5 (like Gecko) (Kubuntu)',
  56. 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; ZoomSpider.net bot; .NET CLR 1.1.4322)',
  57. 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; QihooBot 1.0 qihoobot@qihoo.net)',
  58. 'Mozilla/4.0 (compatible; MSIE 5.0; Windows ME) Opera 5.11 [en]']
  59. sqlerrors = {'MySQL': 'error in your SQL syntax',
  60. 'MiscError': 'mysql_fetch',
  61. 'MiscError2': 'num_rows',
  62. 'Oracle': 'ORA-01756',
  63. 'JDBC_CFM': 'Error Executing Database Query',
  64. 'JDBC_CFM2': 'SQLServer JDBC Driver',
  65. 'MSSQL_OLEdb': 'Microsoft OLE DB Provider for SQL Server',
  66. 'MSSQL_Uqm': 'Unclosed quotation mark',
  67. 'MS-Access_ODBC': 'ODBC Microsoft Access Driver',
  68. 'MS-Access_JETdb': 'Microsoft JET Database',
  69. 'Error Occurred While Processing Request' : 'Error Occurred While Processing Request',
  70. 'Server Error' : 'Server Error',
  71. 'Microsoft OLE DB Provider for ODBC Drivers error' : 'Microsoft OLE DB Provider for ODBC Drivers error',
  72. 'Invalid Querystring' : 'Invalid Querystring',
  73. 'OLE DB Provider for ODBC' : 'OLE DB Provider for ODBC',
  74. 'VBScript Runtime' : 'VBScript Runtime',
  75. 'ADODB.Field' : 'ADODB.Field',
  76. 'BOF or EOF' : 'BOF or EOF',
  77. 'ADODB.Command' : 'ADODB.Command',
  78. 'JET Database' : 'JET Database',
  79. 'mysql_fetch_array()' : 'mysql_fetch_array()',
  80. 'Syntax error' : 'Syntax error',
  81. 'mysql_numrows()' : 'mysql_numrows()',
  82. 'GetArray()' : 'GetArray()',
  83. 'FetchRow()' : 'FetchRow()',
  84. 'Input string was not in a correct format' : 'Input string was not in a correct format',
  85. 'Not found' : 'Not found'}
  86. timeout = 300
  87. socket.setdefaulttimeout(timeout)
  88. threads = []
  89. urls = []
  90. host = sys.argv[1]
  91. port = int(sys.argv[2])
  92. nick = sys.argv[3]
  93. chan = sys.argv[4]
  94. def revip():
  95. sites = [target]
  96. appid = '01CDBCA91C590493EE4E91FAF83E5239FEF6ADFD'
  97. ip = socket.gethostbyname(target)
  98. offset = 50
  99. num = 1
  100. while offset < 300:
  101. url ="/xml.aspx?AppId=%s&Query=ip:%s&Sources=Web&Version=2.0&Market=en-us&Adult=Moderate&Options=EnableHighlighting&Web.Count=50&Web.Offset=%s&Web.Options=DisableQueryAlterations" % (appid, ip, offset)
  102. conn = httplib.HTTPConnection("api.bing.net")
  103. conn.request("GET", url)
  104. res = conn.getresponse()
  105. data = res.read()
  106. conn.close()
  107. xmldoc = parseString(data)
  108. name = xmldoc.getElementsByTagName('web:DisplayUrl')
  109. for n in name:
  110. temp = n.childNodes[0].nodeValue
  111. temp = temp.split("/")[0]
  112. if temp.find('www.') == -1:
  113. sites.append(temp)
  114. offset += 50
  115. s.send("PRIVMSG %s :%s%s\r\n" % (chan, "[+] Target: ", target))
  116. s.send("PRIVMSG %s :%s%s\r\n" % (chan, "[+] IP: ", ip))
  117. s.send("PRIVMSG %s :%s\r\n" % (chan, "[+] Reverse IP LookUp ..."))
  118. s.send("PRIVMSG %s :%s\r\n" % (chan, "[+] Please wait!"))
  119. s.send("PRIVMSG %s :%s%s%s\r\n" % (chan, "[!] Total: ",len(sites), " domain(s)"))
  120. for si in sites:
  121. s.send("PRIVMSG %s :%s%s%s%s%s%s\r\n" % (chan,"[",num,"/",len(sites),"] http://", si))
  122. sleep(2)
  123. num += 1
  124. def srvinfo():
  125. conn = httplib.HTTPConnection(target, 80)
  126. try:
  127. conn.request("HEAD", "/")
  128. except socket.timeout:
  129. print "[-] Server Timeout"
  130. s.send("PRIVMSG %s :%s\r\n" % (chan, "[-] Server Timeout"))
  131. except(KeyboardInterrupt, SystemExit):
  132. pass
  133. r1 = conn.getresponse()
  134. conn.close()
  135. ip = socket.gethostbyname(target)
  136. server = r1.getheader('Server')
  137. xpoweredby = r1.getheader('x-powered-by')
  138. date = r1.getheader('date')
  139. if xpoweredby == None:
  140. s.send("PRIVMSG %s :%s%s\r\n" % (chan, "[+] Ip of server: ", ip))
  141. s.send("PRIVMSG %s :%s%s\r\n" % (chan, "[+] Server info: ", server))
  142. s.send("PRIVMSG %s :%s%s\r\n" % (chan, "[+] Server date: ", date))
  143. else:
  144. s.send("PRIVMSG %s :%s%s\r\n" % (chan, "[+] Ip of server: ", ip))
  145. s.send("PRIVMSG %s :%s%s\r\n" % (chan, "[+] Server info: ", server))
  146. s.send("PRIVMSG %s :%s%s\r\n" % (chan, "[+] Xpoweredby: ", xpoweredby))
  147. s.send("PRIVMSG %s :%s%s\r\n" % (chan, "[+] Server date: ", date))
  148. def sub():
  149. w00t = 0
  150. s.send("PRIVMSG %s :%s%s\r\n" % (chan, "[+] Target: ", domain))
  151. s.send("PRIVMSG %s :%s\r\n" % (chan, "[+] Checking for subdomains"))
  152. for sub in subdomains:
  153. subdomain = sub+'.'+domain
  154. try:
  155. target = socket.gethostbyname(subdomain)
  156. w00t = w00t+1
  157. s.send("PRIVMSG %s :%s\r\n" % (chan, subdomain))
  158. except:
  159. pass
  160. s.send("PRIVMSG %s :%s%s%s\r\n" % (chan, "[!] Found ",w00t, " subdomain(s)!"))
  161. def SQLi(u):
  162. host = u + "'"
  163. try:
  164. source = urllib2.urlopen(host).read()
  165. for type, eMSG in sqlerrors.items():
  166. if re.search(eMSG, source):
  167. s.send("PRIVMSG %s :%s%s%s%s%s\r\n" % (chan, "[!] w00t,w00t!: ", host, " Error: ", type, " ---> SQL Injection"))
  168. sleep(2)
  169. else:
  170. pass
  171. except:
  172. pass
  173. def search(inurl, maxc):
  174. counter = 0
  175. while counter < int(maxc):
  176. jar = cookielib.FileCookieJar("cookies")
  177. query = inurl+'+site:'+site
  178. results_web = 'http://www.search-results.com/web?q='+query+'&hl=en&page='+repr(counter)+'&src=hmp'
  179. request_web = urllib2.Request(results_web)
  180. agent = random.choice(header)
  181. request_web.add_header('User-Agent', agent)
  182. opener_web = urllib2.build_opener(urllib2.HTTPCookieProcessor(jar))
  183. text = opener_web.open(request_web).read()
  184. stringreg = re.compile('(?<=href=")(.*?)(?=")')
  185. names = stringreg.findall(text)
  186. counter += 1
  187. for name in names:
  188. if name not in urls:
  189. if re.search(r'\(',name) or re.search("<", name) or re.search("\A/", name) or re.search("\A(http://)\d", name):
  190. pass
  191. elif re.search("google",name) or re.search("youtube", name) or re.search("phpbuddy", name) or re.search("iranhack",name) or re.search("phpbuilder",name) or re.search("codingforums", name) or re.search("phpfreaks", name) or re.search("%", name) or re.search("facebook", name) or re.search("twitter", name):
  192. pass
  193. else:
  194. urls.append(name)
  195. tmplist = []
  196. finallist = []
  197. s.send("PRIVMSG %s :%s%s\r\n" % (chan, "[+] Urls collected: ", len(urls)))
  198. for u in urls:
  199. try:
  200. host = u.split("/", 3)
  201. domain = host[2]
  202. if domain not in tmplist and "=" in u:
  203. finallist.append(u)
  204. tmplist.append(domain)
  205. except:
  206. pass
  207. s.send("PRIVMSG %s :%s%s\r\n" % (chan, "[+] Urls for checking: ", len(finallist)))
  208. return finallist
  209. class injThread(threading.Thread):
  210. def __init__(self,hosts):
  211. self.hosts=hosts;self.fcount = 0
  212. self.check = True
  213. threading.Thread.__init__(self)
  214. def run (self):
  215. urls = list(self.hosts)
  216. for u in urls:
  217. try:
  218. if self.check == True:
  219. SQLi(u)
  220. else:
  221. break
  222. except(KeyboardInterrupt,ValueError):
  223. pass
  224. self.fcount+=1
  225. def stop(self):
  226. self.check = False
  227. ircmsg = ""
  228. s = socket.socket( )
  229. s.connect((host, port))
  230. s.send("NICK %s\r\n" % nick)
  231. s.send("USER %s %s baltazar :%s\r\n" % (nick,nick,nick))
  232. s.send("JOIN :%s\r\n" % chan)
  233. while 1:
  234. ircmsg = ircmsg+s.recv(2048)
  235. temp = string.split(ircmsg, "\n")
  236. ircmsg = temp.pop()
  237. for line in temp:
  238. line = string.rstrip(line)
  239. line = string.split(line)
  240. try:
  241. if line[1] == "JOIN":
  242. name = str(line[0].split("!")[0])
  243. s.send("PRIVMSG %s :%s%s\r\n" % (chan, "Welcome, ", name.replace(":","")))
  244. s.send("PRIVMSG %s :%s\r\n" % (chan, "b4ltazar@gmail.com"))
  245. s.send("PRIVMSG %s :%s\r\n" % (chan, "darkb0t.py v.0.1"))
  246. s.send("PRIVMSG %s :%s\r\n" % (chan, "Visit ljuska.org & darkartists.info"))
  247. s.send("PRIVMSG %s :%s\r\n" % (chan, "For help type: !help"))
  248. if line[3] == ":!help":
  249. s.send("PRIVMSG %s :%s\r\n" % (chan, "[+] Commands the b0t understands:"))
  250. s.send("PRIVMSG %s :%s\r\n" % (chan, "[+] !help : Help"))
  251. s.send("PRIVMSG %s :%s\r\n" % (chan, "[+] !usage : Examples of usage"))
  252. s.send("PRIVMSG %s :%s\r\n" % (chan, "[+] !over : Bot quits"))
  253. s.send("PRIVMSG %s :%s\r\n" % (chan, "[+] !clear : Clearing the urls in array!"))
  254. s.send("PRIVMSG %s :%s\r\n" % (chan, "[+] !status : Show status of finished threads"))
  255. s.send("PRIVMSG %s :%s\r\n" % (chan, "[+] !reverse : List domains hosted on the same IP"))
  256. s.send("PRIVMSG %s :%s\r\n" % (chan, "[+] !srvinfo : Some info about target server"))
  257. s.send("PRIVMSG %s :%s\r\n" % (chan, "[+] !sub : Checking for subdomains"))
  258. s.send("PRIVMSG %s :%s\r\n" % (chan, "[+] !dork : Using dork for collecting links and then check for SQLi"))
  259. if line[3] == ":!usage":
  260. s.send("PRIVMSG %s :%s\r\n" % (chan, "[!] !reverse target.com"))
  261. s.send("PRIVMSG %s :%s\r\n" % (chan, "[!] !srvinfo target.com"))
  262. s.send("PRIVMSG %s :%s\r\n" % (chan, "[!] !sub target.com"))
  263. s.send("PRIVMSG %s :%s\r\n" % (chan, "[!] !dork index.php?id= com 10 10"))
  264. if line[3] == ":!over":
  265. s.send("PRIVMSG %s :%s\r\n" % (chan, "[!] darkb0t leaves, visit ljuska.org & darkartists.info"))
  266. print "\n[!] Thx for using darkb0t, visit ljuska.org & darkartists.info"
  267. sys.exit(1)
  268. if line[3] == ":!clear":
  269. urls = []
  270. s.send("PRIVMSG %s :%s\r\n" % (chan, "[!] Array cleared!"))
  271. if line[3] == ":!status":
  272. mainthread = 0
  273. if threads != []:
  274. for thread in threads:
  275. mainthread += thread.fcount
  276. s.send("PRIVMSG %s :%s%s\r\n" % (chan, "[+] Number of threads finished scanning: ", mainthread))
  277. if line[3] == ":!reverse":
  278. target = line[4]
  279. revip()
  280. if line[3] == ":!srvinfo":
  281. target = line[4]
  282. srvinfo()
  283. if line[3] == ":!sub":
  284. domain = line[4]
  285. sub()
  286. if line[3] == ":!dork":
  287. inurl = line[4]
  288. site = line[5]
  289. maxc = line[6]
  290. numthreads = line[7]
  291. s.send("PRIVMSG %s :%s%s\r\n" % (chan, "[+] Dork: ", inurl))
  292. s.send("PRIVMSG %s :%s%s\r\n" % (chan, "[+] Domain: ", site))
  293. s.send("PRIVMSG %s :%s%s\r\n" % (chan, "[+] Number of page to search: ", maxc))
  294. s.send("PRIVMSG %s :%s%s\r\n" % (chan, "[+] Number of threads: ", numthreads))
  295. usearch = search(inurl, maxc)
  296. i = len(usearch) / int(numthreads)
  297. m = len(usearch) % int(numthreads)
  298. z = 0
  299. if len(threads) <= numthreads:
  300. for x in range(0, int(numthreads)):
  301. sliced = usearch[x*i:(x+1)*i]
  302. if (z<m):
  303. sliced.append(usearch[int(numthreads)*i+z])
  304. z += 1
  305. thread = injThread(sliced)
  306. thread.start()
  307. threads.append(thread)
  308. for thread in threads:
  309. thread.join()
  310. except(IndexError):
  311. pass
  312. if(line[0] == "PING"):
  313. sleep(1)
  314. s.send("PONG %s\r\n" % line[1])