| @ -0,0 +1,174 @@ | |||
| #!/usr/bin/python2 | |||
| import time | |||
| import socket | |||
| import requests | |||
| import threading | |||
| from colorama import Fore, Back, Style | |||
| TIMEOUT = 0.1 | |||
| SLEEP = 0 | |||
| BUFF = 8192 | |||
| HOST = "192.168.1.2" | |||
| TEAM_NAME = [ | |||
| "RevID.CTF", | |||
| "Youtube", | |||
| "Flag Earth", | |||
| "UMN", | |||
| "Pengen Mandi", | |||
| "Gundar Cysec", | |||
| "gaboet berfaedah", | |||
| "Fake Team", | |||
| "UNAIR FT SHL", | |||
| "Jangan Dibaca tJOY", | |||
| ] | |||
| CHALLENGE = [ | |||
| "MTP - Crypto", | |||
| "Sophisticated Calculator - Pwn", | |||
| "My Secure Web App - Web", | |||
| "Save HTML Design - Web", | |||
| "Name Generator - Pwn", | |||
| "Web Image Search - Web", | |||
| ] | |||
| EXPECTED_ANSWER = { | |||
| 1: " ! +-+-+-+-+-+-+-+-+-+ +-+-+-+ +-+-+-+\n ^ |S|l|a|s|h|R|o|o|t| |C|T|F| |3|.|0|\n / \\ +-+-+-+-+-+-+-+-+-+ +-+-+-+ +-+-+-+\n /___\\\n |= =| +-+-+-+-+-+-+-+ +-+-+ +-+-+-+-+-+-+-+-+\n | B | |M|i|s|s|i|o|n| |T|o| |D|y|s|n|o|m|i|a|\n | A | +-+-+-+-+-+-+-+ +-+-+ +-+-+-+-+-+-+-+-+\n | L |\n /| I |\\ [G] Get Session\n / |##!##| \\ [S] Set Session\n| / ^ | ^ \\ | [T] Generate Token\n|/ (( | )) \\| [L] Let's Go\n (( )) [C] Cancel\n ( )\n .\n \n", | |||
| 2: "Welcome to Online Calculator v3.1\n\nOperator supported: + - * /\nex: 2 + 2\nex: 2 + a //'a' to use last results\n\n------------------------------------\n>", | |||
| 5: ">> Your Nick: ", | |||
| } | |||
| LOCK = threading.Lock() | |||
| class Challenge(object): | |||
| down = 0 | |||
| stat = 1 | |||
| def __init__(self, challPort, challName): | |||
| self.name = challName | |||
| self.port = challPort | |||
| def set_down(self): | |||
| if self.stat: | |||
| self.stat = 0 | |||
| self.down = time.time() | |||
| def set_up(self): | |||
| self.stat = 1 | |||
| self.down = 0 | |||
| def get_downtime(self): | |||
| return int(round(time.time() - self.down)) | |||
| class Team(object): | |||
| def __init__(self, port, teamName): | |||
| self.name = teamName | |||
| self.port = port | |||
| self.challengeList = [Challenge(index, challName) | |||
| for index, challName in enumerate(CHALLENGE, start=1)] | |||
| def main(): | |||
| teamList = [Team(port, teamName) | |||
| for port, teamName in enumerate(TEAM_NAME, start=1)] | |||
| while True: | |||
| for team in teamList: | |||
| for chall in team.challengeList: | |||
| #threading._start_new_thread(test_challenge, (team, chall)) | |||
| test_challenge(team, chall) | |||
| time.sleep(SLEEP) | |||
| def success(team, chall): | |||
| msg = now() + "[6" + str(team.port).zfill(2) + str(chall.port).zfill(2) + \ | |||
| "] " + team.name + " " + chall.name + " is UP" | |||
| if not chall.stat: | |||
| msg += " again total down time = " + str(chall.get_downtime()) + "s" | |||
| with open("new_check.log", "a") as log: | |||
| log.write(msg + "\n") | |||
| chall.set_up() | |||
| LOCK.acquire() | |||
| print(Fore.GREEN + msg + Style.RESET_ALL) | |||
| LOCK.release() | |||
| def failed(team, chall): | |||
| chall.set_down() | |||
| msg = now() + "[6" + str(team.port).zfill(2) + str(chall.port).zfill(2) + "] " + \ | |||
| team.name + " " + chall.name + " is DOWN for " + \ | |||
| str(chall.get_downtime()) + "s" | |||
| with open("new_check.log", "a") as log: | |||
| log.write(msg + "\n") | |||
| LOCK.acquire() | |||
| print(Fore.RED + msg + Style.RESET_ALL) | |||
| LOCK.release() | |||
| def now(): | |||
| return time.strftime("%X ") | |||
| def test_challenge(team, chall): | |||
| port = 60000+team.port*100+chall.port | |||
| ''' | |||
| if chall.port == 3: | |||
| return | |||
| ''' | |||
| if chall.name[-3:] == "Web": | |||
| chk = test_web(port) | |||
| else: | |||
| chk = test_socket(port) | |||
| if chk: | |||
| success(team, chall) | |||
| else: | |||
| failed(team, chall) | |||
| def test_socket(port): | |||
| try: | |||
| socket.setdefaulttimeout(TIMEOUT) | |||
| s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | |||
| s.connect((HOST, port)) | |||
| r = "" | |||
| t = EXPECTED_ANSWER[port % 100] | |||
| chk = False | |||
| while not chk: | |||
| r += s.recv(BUFF) | |||
| chk = r == t | |||
| return chk | |||
| except KeyboardInterrupt: | |||
| exit(0) | |||
| except: | |||
| return False | |||
| def test_web(port): | |||
| try: | |||
| r = requests.get("http://"+HOST+":"+str(port), timeout=TIMEOUT) | |||
| chk1 = True # r.text == EXPECTED_ANSWER[get_chall(port)] | |||
| chk2 = r.status_code == requests.codes.ok | |||
| if chk1 and chk2: | |||
| return True | |||
| else: | |||
| return False | |||
| except KeyboardInterrupt: | |||
| exit(0) | |||
| except: | |||
| return False | |||
| if __name__ == '__main__': | |||
| main() | |||