Cover V10, I05
Article

may2001.tar


A Look at ngrep

Ron McCarty

Network troubleshooting often requires the use of a sniffer, and many network administrators automatically reach for tcpdump (http://www.tcpdump.org/), which is useful across many platforms. With the increasing number of protocols supported on IP, administrators often need to look further into the payload of packets to ensure that applications or users are providing information expected by the receiving IP stack.

ngrep is a sniffer than can be used like tcpdump, and it provides the additional capability of "grepping" the packet's payload for particular matches. The regular express support of ngrep tries to support resembles the GNU version of grep, which gives many advanced feature such as printing lines after the matched expression.

ngrep is available at:

http://ngrep.sourceforge.net/
and requires libpcap, which is available at the tcpdump Web site:

http://www.tcpdump.org/
libpcap is already on systems that have tcpdump installed. Installation of ngrep is straightforward -- typically a configure, make, and make install will have it up and running. Because it uses libpcap, a wide range of interfaces and operating systems are supported.

ngrep, like tcpdump, can be used to print packets matching a particular protocol. For example, you can use the following to print all UDP packets:

ngrep '' udp
or ICMP packets with:

ngrep '' icmp
Specific ports can be used. For example, the domain name system (DNS) uses TCP or UDP ports 53, so:

ngrep '' port 53
will show all DNS requests, such as this request for www.sysadminmag.com:

U 192.168.1.100:1034 -> 4.2.2.1:53
  :............www.samag.com.....
#
U 4.2.2.1:53 -> 192.168.1.100:1034
  :............www.samag.com................................!.%.........
  ....A.ROOT-SERVERS.NET..............E.GTLD-SERVERS.X.............F.k..
  ...........J.k.............K.k.............A.k.............M.k........
  .....G.k.............C.k.............I.k.............B.k.............D
  .k.I.......o...)...i......}.....QE...............C........'>....de....
  ....f...............BY...).&.........*....re........"....).e..........
  ...............Y...$..........07....j................. ;
whereas grep '' tcp port 23 will print telnet packets. (To determine the appropriate ports, check /etc/services, or consult the Internet Assigned Numbers Authority at: http://www.iana.org/numbers.htm.)

To troubleshoot Microsoft browsing traffic for the NT Domain BIGWORLD, you can use:

ngrep '' port 138

U 192.168.1.101:138 -> 192.168.1.255:138
  .......e...... EOFFENECEFFCDJCACACACACACACACAAA. ABACFPFPENFDECFCEPFHF
  DEFFPFPACAB..SMB%..............................(...................(.V
  .........9.\MAILSLOT\BROWSE....'..BIGWORLD........... @.....NUMBER8.
But to really take advantage of ngrep, just pick up the LILWORLD traffic:
ngrep 'LILWORLD' port 138

###################################
U 192.168.1.101:138 -> 192.168.1.255:138
  .......e...... EOFFENECEFFCDJCACACACACACACACAAA. ABACFPFPENFDECFCEPFHF
  DEFFPFPACAB..SMB%..............................(...................(.V
  .........9.\MAILSLOT\BROWSE....'..LILWORLD........... @.....NUMBER9.
This could be very difficult to troubleshoot with tcpdump in a larger network.

Email

The simple mail transport protocol (SMTP) is an ASCII-based protocol, so ngrep can be useful for troubleshooting SMTP email. For example, to monitor current delivery and print sender and recipients, use:

ngrep -iq 'rcpt to|mail from' tcp port 25

T 192.168.1.254:1043 -> 206.46.170.36:25 [AP]
  MAIL From:<mccarty@somedomain.com> SIZE=42..

T +63.769851 192.168.1.254:1043 -> 206.46.170.36:25 [AP]
  RCPT To:<ronald.mccarty@gte.net>..

T 192.168.1.254:1043 -> 206.46.170.36:25 [AP]
  RCPT To:<ronald.mccarty@gte.net>..
This may come in handy to identify the sender of the recent popular mail viruses that read Outlook address books and send the virus to other users.

Version 3 of the post office protocol (POP3) can also be tested in much the same way as SMTP. For example, if it is possible that the user is misspelling the user name:

ngrep 'user' port 110

T 192.168.1.100:1889 -> 192.168.1.1:110 [AP] user test..

ICMP

Most troubleshooting of ICMP can be achieved with the ping commands, but there are different implementations of ping. For example, Microsoft operating systems fill the ICMP payload with the alphabet, so you can determine whether a host that is pinging is actually a Windows machine with:

ngrep -q 'abcd' icmp

I 192.168.1.100 -> 192.168.1.254 8:0
  ....abcdefghijklmnopqrstuvwabcdefghi
Web

Hypertext transport protocol (HTTP) is text based and shares all kinds of information between the server and client. For example, to determine the client application that the client host is running, use:

ngrep -iq 'user-agent' tcp port 80
(HTTP actually calls for a udp version as well, but it has never caught on.)

This particular case shows that the user is using lynx:

T 192.168.1.254:1065 -> 64.4.43.7:80 [AP]
  GET / HTTP/1.0..Host: www.hotmail.com..Accept: text/html, text/plain,
  audio/mod, image/*, video/*, video/mpeg, application/pgp, application/
  pgp, application/pdf, message/partial, message/external-body, applicat
  ion/postscript, x-be2, application/andrew-inset, text/richtext, text/e
  nriched..Accept: x-sun-attachment, audio-file, postscript-file, defaul
  t, mail-file, sun-deskset-message, application/x-metamail-patch, text/
  sgml, */*;q=0.01..Accept-Encoding: gzip, compress..Accept-Language: en
  ..User-Agent: Lynx/2.8.3dev.18 libwww-FM/2.14....
Of course, the version of HTTP that is being used can be determined by using "HTTP" as the search expression, or the server being run using "SERVER" as the expression. Some attacks on Web servers try to request documents with periods as the file name, such as ../. ngrep can also check for these:

ngrep '../'

T 192.168.1.100:1103 -> 10.1.1.1:80 [AP]
  GET /../ HTTP/1.0..Host: www.somedomain.to..Accept: text/html, text
  /plain, audio/mod, image/*, video/*, video/mpeg, application/pgp, appl
  ication/pgp, application/pdf, message/partial, message/external-body,
  application/postscript, x-be2, application/andrew-inset, text/richtext
  , text/enriched..Accept: x-sun-attachment, audio-file, postscript-file
  , default, mail-file, sun-deskset-message, application/x-metamail-patc
  h, text/sgml, video/mpeg, image/jpeg, image/tiff, image/x-rgb, image/p
  ng, image/x-xbitmap, image/x-xbm, image/gif..Accept: application/posts
  cript, */*;q=0.01..Accept-Encoding: gzip, compress..Accept-Language: e
  n..User-Agent: Lynx/2.8.4dev.7 libwww-FM/2.14....
This same technique can be used to determine what an ftp server is reporting as its version:

ngrep '220' port 21

T 209.155.82.18:21 -> 192.168.1.100:1105 [AP]
  220 wcarchive.cdrom.com FTP server (Version DG-4.0.62 974200128) ready
or to investigate Secure Shell, which can be tough to debug during the first install:

ngrep 'SSH' port 22

T 192.168.1.1:22 -> 192.168.1.100:1023 [AP]
  SSH-1.5-1.2.27.
##
T 192.168.1.100:1023 -> 192.168.1.1:22 [AP]
  SSH-1.5-OpenSSH_2.1.1.
Neat Features of ngrep

Some of the nicer features of ngrep are obvious to systems administrators, but may be less obvious to network administrators with light sys admin duties. Let's look at some of them:

-A n -- The -A feature prints out "n" packets after the match. This could be useful, for example, to print out several lines after the "to:" in the address header of smtp to get a more complete picture of the header.

-l -- Sometimes it is necessary to pipe the output of grep to another program for more processing. However, normal ngrep behavior will seem sporadic when piped to the other program because it first fills its buffer before printing matching packets. By using the -l, the output will be printed immediately as opposed to waiting for ngrep's buffer to fill before printing.

-v -- The -v will print all lines not matching the expression. This is useful during initial troubleshooting where a cause is not yet known, but you can assume it is not generated by the traffic you are sending to the host from your remote host while accessing the host. For example, if you telnet to the host to start troubleshooting, use:

ngrep -v '' port 23
to see all the traffic but telnet.

-d -- The -d allows you to specify the device you want to monitor. The complete path to the device name is not required. Thus:

ngrep -d le0 ''
will listen to le0 on a Solaris box.

Summary

ngrep, like its cousin tcpdump, is handy for network troubleshooting. With the addition of being able to search with regular expressions, ngrep is worth adding to your network tool box. Weighing in at a little over 100 K, it is also worth considering for your emergency and network floppy distributions.

Ronald McCarty received his bachelor's degree in Computer and Information Systems at the University of Maryland's international campus at Schwaebisch Gmuend, Germany. After completing his degree, Ronald McCarty started his network career as network administrator at the Schwaebisch Gmuend campus. Ronald McCarty works for Lucent Technologies as a senior systems engineer on a customer team responsible for a major telecommunications carrier. He spends his free time with his two best friends in the world: his daughter, Janice, and his wife, Claudia. Ron can be reached at: ronald.mccarty@gte.net.