Thanks for the (detailed) info.
Verfasst von admin unter Allgemeines am 2. März 2010
Just a short one. I have just got this on an email from my Web Hosting company.
+======================================+ PHP5-Update am 16.03.2010 um 10:00 Uhr +======================================+ Es erfolgt ein Update aller Editionen von PHP5. So wird die bisherige LATEST-Edition 5.2.11 zur regulären und empfohlenen Edition "5-STABLE", während die aktuelle STABLE-Edition 5.2.9 weiterhin als Vorgängerversion "5-LEGACY" bereitstehen wird. Neu zur Verfügung steht die Version 5.2.13, diese ersetzt die bisherige LATEST-Edition 5.2.11. Das am Dienstag, den 16.03.2010, um ca. 10:00 Uhr erfolgende Update erfolgt selbstverständlich vollautomatisch, es ist Ihrerseits kein manuelles Eingreifen erforderlich.
This comes to say in a nutshell, we have this and this vulnerable PHP version and we’ll proceed to update to this one. As grateful as I am for the information, I can’t stop thinking that maybe it’s a bit too much.
Yes, I know this is intended just for customers, but anyway you never know… who your customers are
How to know which process is eating your hard disk
Verfasst von admin unter Allgemeines am 19. Februar 2010
OK, I must admit it. I love to pipe commands, I always thought is one of the most powerful features of the linux command line.
The following case is an excellent example.
Now and then I’ve been experiencing random increments in my hard disk usage. And with increments I mean the whole processor was busy with I/O operations. I asked some colleagues, experienced Linux administrators if there were a tool like top, with which I would be able to find out which process is accessing the disk at most. No one came with an answer.
After some research I found a quite satisfactory solution using a bit of bash.
root@dell:~# pidstat -d | sort -nr -k 4 | head -10
[...]
16:18:50 898 0,00 236,30 0,00 kjournald2
16:18:50 1 28,97 44,90 1,17 init
16:18:50 416 0,00 6,07 0,00 kjournald2
16:18:50 1915 2,05 1,94 0,05 compiz.real
16:18:50 1204 0,90 0,40 0,01 cron
16:18:50 11618 0,00 0,31 0,07 bash
16:18:50 1125 1,54 0,16 0,00 mount.ntfs
16:18:50 8232 0,08 0,15 0,00 liferea
16:18:50 1344 0,09 0,13 0,00 devkit-power-da
This runs the command pidstat -d, which gives info about disk usage per pid. Then uses the fourth column as index to order numerically the ouput. Note the use of the -r modifier, this is because the normal operation of sort is to show the lower values first and we need the opposite in this case. Finally, the head command just show us the first 10 lines, this is more than necessary.
The fourth column of pidstat’s output is the number of kB (read) pro second. In case you cannot find any value really out of bounds, you can give it a try with “sort -nr -k 3″ which would give us the processes that went amok on reading.
As a further investigation you can use the PID of the process (second column) with lsof to find out which files are being accessed by the crazy proc and try to figure out the exact cause of the problem.
What you do now with this info is up to you
UPDATE: it looks like this is not the best method and there is already a “top-like” monitor for disk activity, called iotop.
root@dell:~# apt-get install iotop
SLCM: Some Linux CLI Magic
Verfasst von admin unter Allgemeines am 20. Januar 2010
I’m right now taking the PWB course (yes, from the creators of Backtrack!) and I must say it is really well structured. Even at the beginning, where very basic concepts/techniques are introduced, it forces you to review interesting stuff. And this is one of the strong points of the course: it’s mostly practical.
While in the process of enumerating usernames from an insecure mail server I had to write a short Python script and feed it with a wordlist of common usernames. The list I had was written in uppercase but what I wanted was lowercase. After some research about the sed command I found a neat way to do this using the command line:
carlos@dell:~$ sed -i ‘y/’ABCDEFGHIJKLMNOPQRSTUVWXYZ’/'abcdefghijklmnopqrstuvwxyz’/’ 200_usernames.txt
where -i means “in place”, that is, search for the pattern, perform the substitution and write on the same file (use with caution!). If you want to test before destroying the original file, -e can be used instead, which writes to the standard output.
This way, besides the pure offensive security stuff you learn, one is forced to research and learn some basic programming and command line tricks as well. Bonus!
Option 81 (sounds like Area 51)
Verfasst von admin unter Allgemeines am 16. Dezember 2009
Trying to diagnose why a process in one of our routers went amok (!) I ran into a document that explains the DHCP/DNS Update mechanism in Windows clients. This topic has always been a bit obscure, so I decided to write a note here for the record.
Option 81 (a.ka. FQDN option) is one of the many DHCP option fields. This one in particular is used by the clients at DHCPREQUEST time to tell the DHCP server how it should behave concerning DNS updates.
For clients running Windows 2000, Windows XP or Windows Server 2003, the process goes like this:
1. The client sends a DHCPREQUEST and include the option 81. By default it requests that the server updates (sends to the DNS server) only the PTR record, while the client is in charge of updating his own A record.
2. If the server is configured with the default settings (update DNS entries only if clients ask for it) answers with a DHCPACK which contains the option 81 which says that it will only update the PTR record, as requested.
3. The only thing left after the agreement is to do it! The client sends a dynamic DNS update to the DNS server and the DHCP server updates the PTR on behalf of the client.
I got this info at the Microsoft Technet site but how does this work when the DHCP server is a Cisco router, instead of a MS server?
Inside the ip dhcp pool section there’s an option to specify how should this server manage the DNS updates. The syntaxis is as follows:
update dns [both | never] [override] [before]
The default option, that is, the behaviour when this option is not explicitly configured is to don’t perform any update. This is similar to using the option never, I guess.
The interesting options here are both and override, which have opposite effects.
Both will make the Cisco router to update both entries (A and PTR) on behalf of the client. This could be useful if the client lacks this capability, for example a very old Windows client.
Override, on the other side, will instruct the router to perform DDNS updates for PTR records even if the client has specified that the server should not send updates.
Long story short, in a regular network configuration with MS Windows clients, the Cisco router should be configured with the (sub)command “update dns” to let the client update its own A record, while the router takes care of the PTR RR.
Juniper impressions
Verfasst von admin unter Allgemeines am 27. November 2009
I thought it would be interesting to record my opinion (or should I say prejudices) about Juniper right before starting with the certifications.
Juniper hardware is a server architecture, with Intel processors. For that reason they cannot deliver near the performance of a Cisco device, which has dedicated hardware.
On the other hand, being based on FreeBSD with routing/firewalling daemons makes possible to use the full power of a Unix shell within the OS.
Let’s see if after the JNCIS-SEC certification they end up convincing me
Update: it looks like they have some ASIC integrated for R/S functions. I don’t recall seeing that…
Trace your way through the ASA
Verfasst von admin unter Allgemeines am 24. November 2009
There are few things more difficult than debugging a complex problem in a firewall. Everybody that had to do it even just once would have, for sure, nice memories about it.
But as almost everything, it just a matter of having the right tool. In the case of a Cisco ASA is all about the Packet Tracer.
The syntax is as follows:
packet-tracer input inside tcp 172.27.2.70 1025 172.29.4.18 3389 detailed
where the numbers are the IP:port source and destination and inside is the name of the interface where the packet “originates”.
This injects a virtual packet into the firewall engine and trace every step through it. As an example, some of the info we get looks like this:
Phase: 3
Type: ROUTE-LOOKUP
Subtype: input
Result: ALLOW
Config:
Additional Information:
in 172.29.4.16 255.255.255.240 outside
[...]
Phase: 6
Type: NAT
Subtype: host-limits
Result: ALLOW
Config:
nat (inside) 2 access-list ********
match ip inside ***** 255.255.0.0 inside ****** 255.255.255.192
dynamic translation to pool 2 (No matching global)
translate_hits = 0, untranslate_hits = 0
Additional Information:
Forward Flow based lookup yields rule:
in id=0xcc8940e8, priority=2, domain=host, deny=false
hits=23838, user_data=0xcc893cd0, cs_id=0x0, reverse, flags=0x0, protocol=0
src ip=172.27.0.0, mask=255.255.0.0, port=0
dst ip=0.0.0.0, mask=0.0.0.0, port=0, dscp=0x0
[...]
Phase: 7
Type: VPN
Subtype: encrypt
Result: ALLOW
Config:
Additional Information:
Forward Flow based lookup yields rule:
out id=0xcd9715d8, priority=70, domain=encrypt, deny=false
hits=79, user_data=0x9730c, cs_id=0xcd790d80, reverse, flags=0x0, protocol=0
src ip=172.27.0.0, mask=255.255.0.0, port=0
dst ip=172.29.4.16, mask=255.255.255.240, port=0, dscp=0x0
[...]
And the most important, the final result (end to end)
Result:
input-interface: inside
input-status: up
input-line-status: up
output-interface: outside
output-status: up
output-line-status: up
Action: allow
This way is “easy” to determine where the packet got dropped. For the GUI maniacs there is the graphical version as a tool in Cisco ASDM. Here a screenshot.
CCSA Exam
Verfasst von admin unter Allgemeines am 24. November 2009
Without violation the NDA
this is my short review of the exam:
It consists of 70 questions and you need to get 70% of them right (quite easy)
It’s possible to go back and mark for review! Incredible if you are used to Cisco Exams…
The usual questions are asked regarding the basic topics: rule creation and modification, NAT, CLI management and maintaining a Check Point solution (backup, monitoring, etc.)
For me, the boomer was more QoS questions than expected, specially critical if you used the “NGX R65 Security Administration” book to prepare the exam (which doesn’t contain a word about QoS :-/)
Anyway, this is an easy one if you have some experience (from 0 to 6 months) with the NGX R65, a VMWare image to play with and a good book. If you have any doubt… don’t. Go for it
DLL injection, baby
Verfasst von admin unter Allgemeines am 25. September 2009
There’s a lot of concepts (specially in the world of computer security) which look very mystic and dll injection is, without any doubt, one of those. I’ll just post here a proof of concept because… well, because I think it’s interesting shit!
I’ll do it on Linux because I feel more comfortable in this OS but the concept is similar in MS Windows. First of all, an excerpt from an online program library howto:
Shared libraries are libraries that are loaded by programs when they start. When a shared library is installed properly, all programs that start afterwards automatically use the new shared library. It’s actually much more flexible and sophisticated than this, because the approach used by Linux permits you to:
- update libraries and still support programs that want to use older, non-backward-compatible versions of those libraries;
- override specific libraries or even specific functions in a library when executing a particular program.
- do all this while programs are running using existing libraries.
The second point is the interesting one for us, since it will allow us to “impersonate” some of the functions the program calls that are situated inside dynamic link libraries. Several examples crossed my mind right now, all of them containing functions with names like checkPassword() or something similar
Instead of giving a boring lecture I’ll try to explain every point on the way. Let’s say our target program is this one (core.c):
#include <stdio.h>
#include <stdint.h>
#include <time.h>int
main(int argc, char **argv)
{
time_t result;printf(“I’m about to call time() in time.h\n”);
result = time(NULL);
printf(“The time is %ju secs\n”, (uintmax_t)result);return(0);
}
It just get the system time using the time() function in glibc 2.0 and prints it to the console.
carlos@pattern:~/Projects/dll_injection$ ./core
I’m about to call time() in time.h
The time is 1253876880 secs
carlos@pattern:~/Projects/dll_injection$ ./core
I’m about to call time() in time.h
The time is 1253876888 secs
Until here, nothing really interesting so let’s get a bit more deep. In order to get the system time, core.c uses a function which code is not in my program but inside a shared library. Our core.c program publishes, after compiling, a series of symbols, that is, information about where should these functions code be inserted. This can be inspected with nm:
carlos@pattern:~/Projects/dll_injection$ nm core
08049f20 d _DYNAMIC
08049ff4 d _GLOBAL_OFFSET_TABLE_
0804853c R _IO_stdin_used
[...]
0804a014 W data_start
0804a020 b dtor_idx.6637
08048400 t frame_dummy
08048424 T main
U printf@@GLIBC_2.0
U puts@@GLIBC_2.0
U time@@GLIBC_2.0
Notice how time and printf are listed here. We can see as well what libraries are linked at runtime with ldd:
carlos@pattern:~/Projects/dll_injection$ ldd core
linux-gate.so.1 => (0xb8058000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7eda000)
/lib/ld-linux.so.2 (0xb8059000)
As expected, the libc is listed here, along with a very special one ld-linux.so.2, the dynamic linker/loader.
From the man page:
ld.so loads the shared libraries needed by a program, prepares the program to run, and then runs it. Unless explicitly specified via the -static option to ld during compilation, all Linux programs are incomplete and require further linking at run time.
[SuperNerd parenthesis]
GCC inserts at compile time an ELF header specifying which dynamic loader will be used at runtime:
carlos@pattern:~/Projects/dll_injection$ readelf -l core
Elf file type is EXEC (Executable file)
Entry point 0×8048370
There are 8 program headers, starting at offset 52Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
PHDR 0×000034 0×08048034 0×08048034 0×00100 0×00100 R E 0×4
INTERP 0×000134 0×08048134 0×08048134 0×00013 0×00013 R 0×1
[Requesting program interpreter: /lib/ld-linux.so.2]
LOAD 0×000000 0×08048000 0×08048000 0×00580 0×00580 R E 0×1000
LOAD 0×000f0c 0×08049f0c 0×08049f0c 0×00110 0×00118 RW 0×1000
DYNAMIC 0×000f20 0×08049f20 0×08049f20 0×000d0 0×000d0 RW 0×4
NOTE 0×000148 0×08048148 0×08048148 0×00020 0×00020 R 0×4[...]
That instructs the OS to pass the control of the program to ld-linux.so.2 instead of the normal entry point of the application.
[End of SuperNerd parenthesis]
ld-linux.so.2 checks the symbols (the way nm does), searches for the library files and loads the corresponding code into the process memory.
There’s a way, however, of preloading a shared object (or dll) at run time giving it precedence over this process. Here is where the technical info gets obscure but I guess this lib becomes a preferred target for symbol retrieval, so if it contains a symbol with a matching name, its code will be loaded and this dependency marked as satisfied.
That’s all we need to know. Let’s create our shared object then with a function called… yes, time()
carlos@pattern:~/Projects/dll_injection$ cat lib_evil.c
/* The evil library.
It exports the symbol time()
and overrides glibc
*/#include <stdio.h>
int time()
{
printf(“FAKE TIME FUNCTION says: No you didn’t!\n”);
return(1234);
}
and compile it as shared object:
To create the object file:
$ gcc -c -fPIC -ggdb -Wall -o lib_evil.o lib_evil.c
To create the shared object (library .so):
$ ld -shared lib_evil.o -o lib_evil.so
Finally, let’s try our cool DLL injection, preloading our evil shared object.
Normal operation
carlos@pattern:~/Projects/dll_injection$ ./core
I’m about to call time() in time.h
The time is 1253881612 secsDLL injection
carlos@pattern:~/Projects/dll_injection$ LD_PRELOAD=”./lib_evil.so” ./core
I’m about to call time() in time.h
FAKE TIME FUNCTION says: No you didn’t!
The time is 1234 secs
Now find your favourite software and try to bypass authentication following this pseudocode:
function checkPassword
return EverythingCool
![]()



