<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Praetorian Prefect &#187; openbsd</title>
	<atom:link href="http://praetorianprefect.com/archives/tag/openbsd/feed/" rel="self" type="application/rss+xml" />
	<link>http://praetorianprefect.com</link>
	<description>Information security, a little slower...a little deeper</description>
	<lastBuildDate>Thu, 29 Jul 2010 16:38:31 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>OSSEC: Agentless&#8230;It&#8217;s good, but not good enough</title>
		<link>http://praetorianprefect.com/archives/2009/11/ossec-agentless-its-good-but-not-good-enough/</link>
		<comments>http://praetorianprefect.com/archives/2009/11/ossec-agentless-its-good-but-not-good-enough/#comments</comments>
		<pubDate>Fri, 06 Nov 2009 00:22:49 +0000</pubDate>
		<dc:creator>Jeremy Rossi</dc:creator>
				<category><![CDATA[Administration]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[Networking]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[agentless]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[openbsd]]></category>
		<category><![CDATA[ossec]]></category>
		<category><![CDATA[ssh]]></category>

		<guid isPermaLink="false">http://praetorianprefect.com/?p=1475</guid>
		<description><![CDATA[In working with OSSEC agentless for some time now I have come across some limitations in the implementation that I felt needed to be addressed.  As OSSEC agentless is designed to preform <code>syscheck</code> functions on remote hosts, more general features are hard (if not impossible) to write into a script. This post will demonstrate an alternative for adding additional features to the OSSEC standard build.]]></description>
			<content:encoded><![CDATA[<div class="wp-caption" style="float: right;margin: 5px;margin-left: 42px;margin-right: 21px;"><img src="http://praetorianprefect.com/wp-content/uploads/2009/11/Screen-shot-2009-11-02-at-8.06.14-PM.png" border="1" alt="ossec_logo" width="66" height="64" /></div>

<p>In working with OSSEC agentless for some time now I have come across some limitations in the implementation that I felt needed to be addressed.  As OSSEC agentless is designed to preform <code>syscheck</code> functions on remote hosts, more general features are hard (if not impossible) to write into a script.</p>

<p>Currently in OSSEC, agentless scripts are limited to the following commands:</p>

<table>
<thead>
<tr>
  <th>Command</th>
  <th>Description</th>
</tr>
</thead>
<tbody>
<tr>
  <td><code>INFO:</code></td>
  <td>The string following INFO will be logged to <code>/var/ossec/logs/ossec.log</code> by OSSEC for debugging.</td>
</tr>
<tr>
  <td><code>ERROR:</code></td>
  <td>Error needs to be reported.  The string following this command is forwarded to the OSSEC manager, and the OSSEC process closes down the script.</td>
</tr>
<tr>
  <td><code>STORE:</code></td>
  <td>All the lines that follow this command will be added, stored, and compared to previous runs of the script.</td>
</tr>
<tr>
  <td><code>FWD:</code></td>
  <td>The string following FWD is a colon delimited list of stats on a given file.  Example: <code>FWD: &lt;size&gt;:&lt;permissions&gt;:&lt;uid&gt;:&lt;gid&gt;:&lt;md5&gt;:&lt;sha1&gt; &lt;path &amp; file&gt;</code></td>
</tr>
</tbody>
</table>

<p>Given the choices listed here more advanced agentless scripts are just not reasonably possible.  I require the ability to pass more information to the OSSEC agentless process and have it raise alerts based on this information.</p>

<h3>Solution patch OSSEC</h3>

<p>So I starting digging into the OSSEC code.  I am not a C coder, I don&#8217;t even play one on TV, but the OSSEC&#8217;s code is clear and has just enough comments to allow me to understand how things function.  Once I saw where the communication happens between ossec-agentless and it&#8217;s subprocess I was quickly able to add a new OSSEC Agentless Command.</p>

<table>
<thead>
<tr>
  <th>Command</th>
  <th>Description</th>
</tr>
</thead>
<tbody>
<tr>
  <td><code>LOG:</code></td>
  <td>The string following LOG: will be passed into <code>ossec-analysisd</code> and processed like all other log messages.</td>
</tr>
</tbody>
</table>

<p>This simple command allow scripts to generate messages that will get processed by the standard OSSEC decoders and rules.</p>

<ul>
<li>Direct download of patch: <a href="http://praetorianprefect.com/wp-content/uploads/2009/11/agentless.patch.txt" title="agentless.patch.txt">agentless.patch.txt</a></li>
</ul>

<h3>Patching OSSEC</h3>

<p>The patch I created works with the current code release of OSSEC.  To apply the patch, first download OSSEC version 2.2 from the website.  In the instructions below, I have changed to the tmp directory first as we will be removing the source files once we have finished the install.</p>

<pre><code>obsd46# cd /tmp 
obsd46# ftp http://www.ossec.net/files/ossec-hids-2.2.tar.gz
Trying 75.126.165.213...
Requesting http://www.ossec.net/files/ossec-hids-2.2.tar.gz
100% |******************************************************************|   692 KB    00:03    
Successfully retrieved file.
</code></pre>

<p>Now expand the downloaded archive and change into the newly created directory <code>ossec-hids-2.2</code>.</p>

<pre><code>obsd46# tar xfz ossec-hids-2.2.tar.gz                                                                                                                                                   
obsd46# cd ossec-hids-2.2       
</code></pre>

<p>This is where most of the work will happen, but first we need to download the patch.</p>

<pre><code>obsd46# ftp http://praetorianprefect.com/wp-content/uploads/2009/11/agentless.patch.txt                             
Trying 75.101.150.229...
Requesting http://praetorianprefect.com/wp-content/uploads/2009/11/agentless.patch.txt
100% |******************************************************************| 10278       00:00    
Successfully retrieved file.
</code></pre>

<p>Now we just apply the patch.  We will use the <code>patch</code> command do this, but using the argument <code>-p1</code> to apply the patch cleanly to all sub-directories.</p>

<pre><code>obsd46# patch -p1 &lt; agentless.patch.txt  
Hmm... this looks like a unified diff to me...
The text leading up to this was:
 |-------------------------
 |diff -r 55072a52aaa4 -r 673c04be67e9 etc/decoder.xml
 |--- a/etc/decoder.xml  Wed Nov 04 20:51:36 2009 -0500
 |+++ b/etc/decoder.xml  Fri Nov 06 19:53:36 2009 +0000
 |-------------------------
Patching file etc/decoder.xml using Plan A...
Hunk #1 succeeded at 70.
Hunk #2 succeeded at 1498.
Hmm...  The next patch looks like a unified diff to me...
The text leading up to this was:
 |-------------------------
 |diff -r 55072a52aaa4 -r 673c04be67e9 etc/rules/agentless_rules.xml
 |--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
 |+++ b/etc/rules/agentless_rules.xml    Fri Nov 06 19:53:36 2009 +000 0
 |-------------------------
(Creating file etc/rules/agentless_rules.xml...)
Patching file etc/rules/agentless_rules.xml using Plan A...
Empty context always matches.
Hunk #1 succeeded at 1.
Hmm...  The next patch looks like a unified diff to me...
The text leading up to this was:
 |-------------------------
 |diff -r 55072a52aaa4 -r 673c04be67e9 etc/rules/ossec_rules.xml
 |--- a/etc/rules/ossec_rules.xml        Wed Nov 04 20:51:36 2009 -0500
 |+++ b/etc/rules/ossec_rules.xml        Fri Nov 06 19:53:36 2009 +0000
 |-------------------------
Patching file etc/rules/ossec_rules.xml using Plan A...
Hunk #1 succeeded at 153.
Hmm...  The next patch looks like a unified diff to me...
The text leading up to this was:
 |-------------------------
 |diff -r 55072a52aaa4 -r 673c04be67e9 etc/templates/config/rules.template
 |--- a/etc/templates/config/rules.template      Wed Nov 04 20:51:36 2009 -0500
 |+++ b/etc/templates/config/rules.template      Fri Nov 06 19:53:36 2009 +0000
 |-------------------------
Patching file etc/templates/config/rules.template using Plan A...
Hunk #1 succeeded at 44.
Hmm...  The next patch looks like a unified diff to me...
The text leading up to this was:
 |-------------------------
 |diff -r 55072a52aaa4 -r 673c04be67e9 src/agentlessd/scripts/nmap_policy
 |--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
 |+++ b/src/agentlessd/scripts/nmap_policy       Fri Nov 06 19:53:36 2009 +0000
 |-------------------------
(Creating file src/agentlessd/scripts/nmap_policy...)
Patching file src/agentlessd/scripts/nmap_policy using Plan A...
Empty context always matches.
Hunk #1 succeeded at 1.
done 
</code></pre>

<p>Now we have a completed all the OSSEC 2.2 code patches for the expanded agentless features.  At this point you will need to compile and install OSSEC. For full details the main <a href="http://www.ossec.net/main/documentation/">OSSEC website</a> covers this topic in more detail.  A key thing to note here is that OSSEC has to be installed as a server or locally.</p>

<p>Please see my article on how to enable <a href="/archives/2009/11/ossec-agentless-to-save-the-day/">OSSEC agentless monitoring</a>.</p>

<h3>Making use of the new features</h3>

<p>Now that we have a patched and installed version of OSSEC we can take advantage of the newly added features.  Included with the patch is a new Agentless OSSEC script <code>nmap_policy</code>.  This script is really not designed for production use, rather it&#8217;s geared to show how to use the new agentless features.</p>

<p>Let&#8217;s get into the details. Start by running the new script and looking at the output.  I should note that this script uses <code>python</code> and needs at least version 2.5 in order to parse the xml output from <code>nmap</code>.</p>

<pre><code>obsd45# (cd /var/ossec &amp;&amp; ./agentless -b 21,23,80 -n 172.17.20.20/32 )
INFO: Starting
INFO: running `nmap -p 21,23,80 -oX - 172.17.20.0/24` command
INFO: completed `nmap -p 21,23,80 -oX - 172.17.20.0/24` command
LOG:alert=11 Policy violation port 80 (http) is open on host 172.17.20.1 (00:0E:83:A9:E6:80 Cisco Systems)
LOG:alert=11 Policy violation port 23 (telnet) is open on host 172.17.20.1 (00:0E:83:A9:E6:80 Cisco Systems)
LOG:alert=11 Policy violation port 80 (http) is open on host 172.17.20.19 (00:18:8B:1E:27:A5 Dell)
LOG:alert=11 Policy violation port 80 (http) is open on host 172.17.20.20 (00:0C:29:84:72:11 VMware)
LOG:alert=11 Policy violation port 21 (ftp) is open on host 172.17.20.20 (00:0C:29:84:72:11 VMware)
LOG:alert=11 Policy violation port 80 (http) is open on host 172.17.20.21 (00:0C:29:8D:39:E4 VMware)
LOG:alert=11 Policy violation port 21 (ftp) is open on host 172.17.20.21 (00:0C:29:8D:39:E4 VMware)
LOG:alert=11 Policy violation port 80 (http) is open on host 172.17.20.31 (00:0C:29:29:CF:35 VMware)
LOG:alert=11 Policy violation port 80 (http) is open on host 172.17.20.32 (00:0C:29:58:5F:C1 VMware)
LOG:alert=11 Policy violation port 80 (http) is open on host 172.17.20.57 (00:1E:0B:9D:C0:03 Hewlett Packard)
LOG:alert=11 Policy violation port 80 (http) is open on host 172.17.20.91 (00:14:38:D8:01:DD Hewlett Packard)
LOG:alert=11 Policy violation port 21 (ftp) is open on host 172.17.20.134 (00:1E:C2:03:2D:E8 Apple)
LOG:alert=11 Policy violation port 80 (http) is open on host 172.17.20.202 (00:19:B9:24:7E:F2 Dell)
LOG:alert=11 Policy violation port 80 (http) is open on host 172.17.20.203 (00:19:B9:24:7E:F2 Dell)
INFO: Ending
</code></pre>

<p>So what this script does is run <code>nmap</code> and looks for ports that are open and not allowed per an internal policy.  In this example I checked for http, telnet, and ftp, but the selection of ports is configurable with the <code>-b</code>/<code>--badport</code> arguments.  The second argument <code>-n</code>/<code>--network</code> is used to specify which IP addresses to scan.  The format of this option is very liberal, in fact any valid <code>nmap</code> network specification will work.</p>

<p>Just as I specified above any string following the <code>LOG:</code> OSSEC agentless command will be pushed to the <code>ossec-analysisd</code> process for decoding and rules filtering.</p>

<p>As part of the patch I have also included an updated <code>decode.xml</code> and a new <code>agentless_rules.xml</code> to begin the first level of processing of output from the scripts.  Using <code>ossec-logtest</code> we can see this in action, but due to how <code>ossec-agentlessd</code> processes the messages we need to slightly modify the output for it to work with <code>ossec-logtest</code>.</p>

<pre><code>obsd46# (cd /var/ossec &amp;&amp; ./bin/ossec-logtest )                                                                                                                                                            
2009/11/06 20:48:28 ossec-testrule: INFO: Started (pid: 9789).
ossec-testrule: Type one log per line.

Agentless: Log:alert=11 Policy violation port 80 (http) is open on host 172.17.20.1 (00:0E:83:A9:E6:80 Cisco Systems)


**Phase 1: Completed pre-decoding.
       full event: 'Agentless: Log:alert=11 Policy violation port 80 (http) is open on host 172.17.20.1 (00:0E:83:A9:E6:80 Cisco Systems)'
       hostname: 'a'
       program_name: '(null)'
       log: 'Agentless: Log:alert=11 Policy violation port 80 (http) is open on host 172.17.20.1 (00:0E:83:A9:E6:80 Cisco Systems)'

**Phase 2: Completed decoding.
       decoder: 'agentless'
       id: '11'
       extra_data: 'Policy violation port 80 (http) is open on host 172.17.20.1 (00:0E:83:A9:E6:80 Cisco Systems)'

**Phase 3: Completed filtering (rules).
       Rule id: '10011'
       Level: '11'
       Description: 'Agentless.'
**Alert to be generated.
</code></pre>

<p>You can see from the output that a level 11 alert would be generated for the line we just tested with <code>ossec-logtest</code>. In the case of the full output of the <code>nmap_policy</code> script it has 13 <code>LOG:</code> lines returned and would have generated 13 alerts. Needless to say this is a lot of alerts, so it&#8217;s up to you to tune and configure this correctly for your environment.</p>

<p>In our lab here at <a href="http://www.praetoriansecuritygroup.com">Praetorian</a> we don&#8217;t ever want to see the telnet port open.  So lets make this script live, but only checking for telnet.  I am going to once again make use of <a href="http://bitbucket.org/jrossi/ossec-hids-tools/">ossec-hids-tools</a> to add the new agentless monitoring.  As is always the case a restart of OSSEC will be needed.</p>

<pre><code>obsd46# ossec-config --section agentless --add --host jrossi@172.17.20.0 --type nmap_policy 
--frequency 86400 --state periodic --argv "-p 23 -n 172.17.20.0/24"
obsd46# (cd /var/ossec &amp;&amp; ./bin/ossec-control restart )
</code></pre>

<p>While adding this new agentless script I had to specify a <code>--host</code> argument. This is required for OSSEC agentless as the host field is <strong>NOT</strong> optional.  In the case of the script <code>nmap_policy</code> it will have no effect, but this needs to be taken into account when writing your own scripts as the first argument passed will always be what you specified as the host.</p>

<p><strong>Related Posts:</strong></p>
<ul>
<li><a href="http://praetorianprefect.com/archives/2010/03/3473/">March&#8217;s Patch Tuesday</a></li>
<li><a href="http://praetorianprefect.com/archives/2010/01/the-aurora-ie-exploit-in-action/">The &#8220;Aurora&#8221; IE Exploit Used Against Google in Action</a></li>
<li><a href="http://praetorianprefect.com/archives/2010/01/scareware-purveyors-spammers-and-crooks-take-advantage-of-haiti-earthquake/">Scareware Purveyors, Spammers, and Crooks Take Advantage of Haiti Earthquake</a></li>
<li><a href="http://praetorianprefect.com/archives/2010/01/baidu-com-the-latest-victim-of-iranian-cyberarmy/">Baidu.com the Latest Victim of Iranian CyberArmy</a></li>
<li><a href="http://praetorianprefect.com/archives/2010/01/junos-juniper-flaw-exposes-core-routers-to-kernal-crash/">JUNOS (Juniper) Flaw Exposes Core Routers to Kernel Crash</a></li>
</ul><br />
]]></content:encoded>
			<wfw:commentRss>http://praetorianprefect.com/archives/2009/11/ossec-agentless-its-good-but-not-good-enough/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OSSEC: Agentless scripts</title>
		<link>http://praetorianprefect.com/archives/2009/11/ossec-agentless-scripts/</link>
		<comments>http://praetorianprefect.com/archives/2009/11/ossec-agentless-scripts/#comments</comments>
		<pubDate>Tue, 03 Nov 2009 23:57:47 +0000</pubDate>
		<dc:creator>Jeremy Rossi</dc:creator>
				<category><![CDATA[Administration]]></category>
		<category><![CDATA[Networking]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[agentless]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[openbsd]]></category>
		<category><![CDATA[ossec]]></category>
		<category><![CDATA[ssh]]></category>

		<guid isPermaLink="false">http://praetorianprefect.com/?p=1419</guid>
		<description><![CDATA[In my last OSSEC post "<a href="/archives/2009/11/ossec-agentless-to-save-the-day/">OSSEC: Agentless to save the day</a>" I went over how to setup agentless monitoring using the built in scripts.  With this post I am going to get into the details of how to modify the OSSEC supplied scripts to do your bidding.]]></description>
			<content:encoded><![CDATA[<p>In my last OSSEC post <a href="/archives/2009/11/ossec-agentless-to-save-the-day/">OSSEC: Agentless to save the day</a> I went over how to setup agentless monitoring using the built in scripts.  With this post I am going to get into the details of how to modify the OSSEC supplied scripts to do your bidding.</p>

<h2>Table of Contents</h2>

<div class="wp-caption" style="float: right;margin: 5px;margin-left: 42px;margin-right: 21px;"><img src="http://praetorianprefect.com/wp-content/uploads/2009/11/Screen-shot-2009-11-02-at-8.06.14-PM.png" border="1" alt="ossec_logo" width="66" height="64" /></div>

<ul>
<li><p><a href="#agentless_scripts">Agentless Scripts</a></p>

<ul>
<li><a href="#agentless_scripts_periodic_diff">Periodic diff Specification</a></li>
<li><a href="#agentless_scripts_periodic">Periodic Specification</a></li>
</ul></li>
<li><a href="#ssh_integrity_check_linux">Agentless Script: ssh_integrity_check_linux</a></li>
<li><p><a href="#ssh_dmz_linux">Our own Agentless Script: ssh_dmz_linux</a></p>

<ul>
<li><a href="#finding_setuid_setgid">Finding all setuid and setgid files</a></li>
<li><a href="#finding_app_files">Finding all authentication and applications specific files</a></li>
<li><a href="#merging_finds">Merging finds</a></li>
<li><a href="#creating_ssh_dmz_linux">Creating ssh_dmz_linux</a></li>
<li><a href="#testing_ssh_dmz_linux">Testing</a></li>
</ul></li>
</ul>

<h2 id="agentless_scripts">Agentless Scripts</h2>

<p>All scripts that work with OSSEC agentless security monitoring use <code>stdout</code> for communication and reporting to the OSSEC server.  This makes writing scripts for OSSEC simple as you do not need to do anything more then print or echo to <code>stdout</code>.  The format of the output does need to meet the OSSEC specification, but that is a very simple thing to do.</p>

<p>Before we move to the specification details I need to explain that OSSEC agentless runs to different types of scripts.  Namely the following:</p>

<table>
<thead>
<tr>
  <th>Type</th>
  <th>Description</th>
</tr>
</thead>
<tbody>
<tr>
  <td>periodic_diff</td>
  <td>Scripts output data to the OSSEC agentless process that will then be compared to past runs and if there are differences an OSSEC alert will be generated.</td>
</tr>
<tr>
  <td>periodic</td>
  <td>Scripts output controlled messages to the OSSEC agentless process that will then be processed accordingly.</td>
</tr>
</tbody>
</table>

<h4 id="agentless_scripts_periodic_diff">Periodic diff Specification</h4>

<p>The output for periodic_diff is very simple, any and all output after the agentless command &#8220;<code>STORE: now</code>&#8221; and before the next OSSEC Command will be stored and compared for differences.  This type of script is mostly used for hardware devices such as Cisco IOS, Juniper JunOS, and other products.</p>

<p>Scripts that use the <code>periodic_diff</code> make use of the following commands:</p>

<table>
<thead>
<tr>
  <th>Command</th>
  <th>Description</th>
</tr>
</thead>
<tbody>
<tr>
  <td>INFO:</td>
  <td>The string following INFO will be logged to <code>/var/ossec/logs/ossec.log</code> by OSSEC for debugging.</td>
</tr>
<tr>
  <td>ERROR:</td>
  <td>Error needs to be reported.  The string following this command is forwarded to the OSSEC manager, and the OSSEC process closes down the script.</td>
</tr>
<tr>
  <td>STORE:</td>
  <td>All the lines that follows this command will be added stored and compared to previous runs of the script</td>
</tr>
</tbody>
</table>

<p>Here is an example of a periodic_diff script that comes with OSSEC. (<em>Please note with all agentless scripts you must be in the root of the OSSEC install for them to function correctly</em>.)</p>

<pre><code>obsd46#( cd /var/ossec &amp;&amp; ./agentless/ssh_pixconfig_diff cisco@172.17.0.1 'show hardware' )
spawn ssh -c des cisco@172.17.0.1
No valid ciphers for protocol version 2 given, using defaults.
Password: 

a.zfw.tss&gt;INFO: Starting.
enable
Password: 
a.zfw.tss#ok on enable pass

STORE: now
no pager
             ^
% Invalid input detected at '^' marker.

a.zfw.tss#term len 0
a.zfw.tss#terminal pager 0
                     ^
% Invalid input detected at '^' marker.

a.zfw.tss#show version | grep -v Configuration last| up
                         ^
% Invalid input detected at '^' marker.

a.zfw.tss#show running-config
Building configuration...


Current configuration : 14631 bytes
!
version 12.4

[................SNIP CONFIG.................]

a.zfw.tss#show hardware
Cisco IOS Software, 3800 Software (C3845-ADVENTERPRISEK9-M), Version 12.4(24)T1, RELEASE SOFTWARE (fc3)
Technical Support: http://www.cisco.com/techsupport
Copyright (c) 1986-2009 by Cisco Systems, Inc.
Compiled Fri 19-Jun-09 19:21 by prod_rel_team

ROM: System Bootstrap, Version 12.3(11r)T2, RELEASE SOFTWARE (fc1)

a.zfw.tss uptime is 1 week, 5 days, 7 hours, 29 minutes
System returned to ROM by reload at 13:34:26 UTC Thu Oct 22 2009
System image file is "flash:c3845-adventerprisek9-mz.124-24.T1.bin"


This product contains cryptographic features and is subject to United
States and local country laws governing import, export, transfer and
use. Delivery of Cisco cryptographic products does not imply
third-party authority to import, export, distribute or use encryption.
Importers, exporters, distributors and users are responsible for
compliance with U.S. and local country laws. By using this product you
agree to comply with applicable laws and regulations. If you are unable
to comply with U.S. and local laws, return this product immediately.

A summary of U.S. laws governing Cisco cryptographic products may be found at:

http://www.cisco.com/wwl/export/crypto/tool/stqrg.html

If you require further assistance please contact us by sending email to
export@cisco.com.

Cisco 3845 (revision 1.0) with 1007615K/40960K bytes of memory.
Processor board ID FTX1043A2CR
2 Gigabit Ethernet interfaces
1 ATM interface
1 Virtual Private Network (VPN) Module
4 CEM T1/E1 ports
DRAM configuration is 64 bits wide with parity enabled.
479K bytes of NVRAM.
492015K bytes of USB Flash usbflash0 (Read/Write)
62720K bytes of ATA System CompactFlash (Read/Write)

Configuration register is 0x2102


a.zfw.tss#exit
Connection to 172.17.0.1 closed by remote host.
Connection to 172.17.0.1 closed.

INFO: Finished.

</code></pre>

<p>In this example above the script would store the contents between &#8220;<code>STORE: now</code>&#8221; and &#8220;<code>INFO: Finished.</code>&#8220;.  If this is the first time that OSSEC agentless has run this command no alerts would be generated and the contents would have been saved for later comparisons.   If OSSEC agentless has a stored copy from a previous execution it will compare the files and if there are any differences it will generate an alert.</p>

<h4 id="agentless_scripts_periodic">Periodic Specification</h4>

<p>The periodic specification has more options and gives more control to the script writer on what actions OSSEC will take.  Once again <code>stdout</code> is used for communication so script writing is easy.</p>

<table>
<thead>
<tr>
  <th>Command</th>
  <th>Description</th>
</tr>
</thead>
<tbody>
<tr>
  <td>INFO:</td>
  <td>The string following INFO will be logged to <code>/var/ossec/logs/ossec.log</code> by OSSEC for debugging.</td>
</tr>
<tr>
  <td>ERROR:</td>
  <td>Error needs to be reported.  The string following this command is forwarded to the OSSEC manager, and the OSSEC process closes down the script.</td>
</tr>
<tr>
  <td>FWD:</td>
  <td>The string following FWD is a colon delimited list of stats on a given file.</td>
</tr>
</tbody>
</table>

<p>Example of real <code>FWD:</code> command.</p>

<pre><code>FWD: 19419:600:0:0:fb30de5b02029950ae05885a3d407c8c:017cd6118cdc166ee8eba8af1b7fdad6763203d3 ./.bash_history
</code></pre>

<p>The Fields break down in to the following</p>

<table>
<thead>
<tr>
  <th>Field</th>
  <th>Description</th>
</tr>
</thead>
<tbody>
<tr>
  <td><code>FWD:</code></td>
  <td>The OSSEC Command</td>
</tr>
<tr>
  <td><code>19419</code></td>
  <td>Total size of file, in bytes</td>
</tr>
<tr>
  <td><code>600</code></td>
  <td>Access rights of file in octal</td>
</tr>
<tr>
  <td><code>0</code></td>
  <td>User ID of file owner</td>
</tr>
<tr>
  <td><code>0</code></td>
  <td>Group ID of file owner</td>
</tr>
<tr>
  <td><code>fb30de5b02029950ae05885a3d407c8c</code></td>
  <td>MD5 Hash of file</td>
</tr>
<tr>
  <td><code>017cd6118cdc166ee8eba8af1b7fdad6763203d3</code></td>
  <td>SHA1 Hash of file</td>
</tr>
<tr>
  <td>./.bash_history</td>
  <td>Path and name of file</td>
</tr>
</tbody>
</table>

<p>Using this format OSSEC can store the information about a file and then in the future run compare that they are the same.  If for some reason they are not the same an alert will be generated.  Here is an example of a password change on a linux system:</p>

<pre><code>OSSEC HIDS Notification.
2009 Sep 21 15:19:00

Received From: (ssh_integrity_check_linux) root@172.17.20.20-&gt;syscheck
Rule: 550 fired (level 7) -&gt; "Integrity checksum changed."
Portion of the log(s):

Integrity checksum changed for: '/etc/shadow'
Old md5sum was: '0d92e12c92f3edcf9d8876ea57c5f677'
New md5sum is : '2bd51b61dea17c5682fb2c0cf4f92c63'
Old sha1sum was: '2270c03a920ef8dd50e11cefdef046a8660f7a29'
New sha1sum is : 'd9518ea9022b10d07f81925c6d7f2abb4364b548'

--END OF NOTIFICATION
</code></pre>

<h2 id="ssh_integrity_check_linux">Agentless Script: ssh_integrity_check_linux</h2>

<p>Now that we have an understanding of how agentless scripts communicate with the parent OSSEC preocess, let&#8217;s move on to a working example.  The OSSEC supplied script <code>ssh_integrity_check_linux</code> is a great place to start, so lets open it up and see what is going on.</p>

<pre><code>obsd46# cat /var/ossec/agentless/ssh_integrity_check_linux
 #!/usr/bin/env expect

 # @(#) $Id: ssh_integrity_check_linux,v 1.11 2009/06/24 17:06:21 dcid Exp $
 # Agentless monitoring
 #
 # Copyright (C) 2009 Trend Micro Inc.
 # All rights reserved.
 #
 # This program is a free software; you can redistribute it
 # and/or modify it under the terms of the GNU General Public
 # License (version 3) as published by the FSF - Free Software
 # Foundation.


 # Main script.
source "agentless/main.exp"


 # SSHing to the box and passing the directories to check.
if [catch {
    spawn ssh $hostname
} loc_error] {
    send_user "ERROR: Opening connection: $loc_error.\n"
    exit 1;
}


source $sshsrc
source $susrc

set timeout 600
send "echo \"INFO: Starting.\"; for i in `find $args 2&gt;/dev/null`;do tail \$i &gt;/dev/null 2&gt;&amp;1 &amp;&amp; 
md5=`md5sum \$i | cut -d \" \" -f 1` &amp;&amp; sha1=`sha1sum \$i | cut -d \" \" -f
 1` &amp;&amp; echo FWD: `stat --printf \"%s:%a:%u:%g\" \$i`:\$md5:\$sha1 \$i; done; exit\r"
send "exit\r"

expect {
    timeout {
        send_user "ERROR: Timeout while running commands on host: $hostname .\n"
        exit 1;
    }
    eof {
        send_user "\nINFO: Finished.\n"
        exit 0;
    }
}

exit 0;
</code></pre>

<p>The comments in the script hints to what is going on, but everything up to and including <code>set timeout 600</code> is related to setting up the <code>expect</code> functions and code for handling the <code>ssh</code> subprocess and connecting to the remote host.  I am not going to spend any time with this section, I am just going to make use of it.</p>

<p>The meat of what is getting processed on the remote end all happens in two lines.</p>

<pre><code>send "echo \"INFO: Starting.\"; for i in `find $args 2&gt;/dev/null`;do tail \$i &gt;/dev/null 2&gt;&amp;1 &amp;&amp; 
md5=`md5sum \$i | cut -d \" \" -f 1` &amp;&amp; sha1=`sha1sum \$i | cut -d \" \" -f
 1` &amp;&amp; echo FWD: `stat --printf \"%s:%a:%u:%g\" \$i`:\$md5:\$sha1 \$i; done; exit\r"
send "exit\r"
</code></pre>

<p>Let&#8217;s break this down to see what is happening.</p>

<p>The <code>send</code> command pushes the following string to the ssh subprocess which gets run on the remote end of the connection.  Before the script is sent to the remote host <code>expect</code> internally processes the string.  This includes searching for variables and removing any control characters.</p>

<p>The control characters are first taken into account, and in the case of our example all escaped special characters are processed.  <code>\"</code>, <code>\r</code>, and <code>\$</code> would be replaced with <code>"</code>, &#8220;<code>carriage return</code>&#8220;, and <code>&amp;</code> respectively.  The reason the escape characters are needed so that they will not interfere with <code>expects</code> own string processing and control.  We will need to handle control characters in this way when we begin writing our own script.</p>

<p>While special characters were being handled by <code>expect</code> it also looked for variables to replace, in this case it will find <code>$args</code> and replace it with what ever arguments were passed to the script by the OSSEC agentless process.  If we specified the following in <code>/var/ossec/etc/ossec.conf</code> the <code>$args</code> variable would be replaced with &#8220;<code>/bin /etc /sbin</code>&#8220;.</p>

<pre><code>  &lt;agentless&gt;
    &lt;type&gt;ssh_integrity_check_linux&lt;/type&gt;
    &lt;frequency&gt;3600&lt;/frequency&gt;
    &lt;host&gt;root@172.17.20.20&lt;/host&gt;
    &lt;state&gt;periodic&lt;/state&gt;
    &lt;arguments&gt;/bin /etc /sbin&lt;/arguments&gt;
  &lt;/agentless&gt;
</code></pre>

<p>Back to the commands that get run.  Once <code>expect</code> has completed replacement we are left with this command.</p>

<pre><code>echo "INFO: Starting."; for i in `find /bin /etc /sbin 2&gt;/dev/null`;do tail $i &gt;/dev/null 2&gt;&amp;1 &amp;&amp; 
md5=`md5sum $i | cut -d " " -f 1` &amp;&amp; sha1=`sha1sum $i | cut -d " " -f
 1` &amp;&amp; echo FWD: `stat --printf "%s:%a:%u:%g" $i`:$md5:$sha1 $i; done; exit
exit
</code></pre>

<p>This script then goes and uses the Unix <code>find</code> command to locate all files in the specified path (from the arguments passed) and generates an OSSEC <code>FWD:</code> command for each one and prints it to <code>stdout</code>.  Making use of the commands <code>stat</code>, <code>md5sum</code>, and <code>sha1sum</code> to generate the data needed.  Here is an example of the output checking.</p>

<pre><code>spawn ssh root@172.17.20.20
Last login: Wed Nov  4 11:32:51 2009 from 172.17.20.131^M
[linux26 ~]# 
INFO: Started.
echo "INFO: Starting."; for i in `find {/bin /etc /sbin} 2&gt;/dev/null`;do tail $i &gt;/dev/null 2&gt;&amp;1 &amp;&amp; 
md5=`md5sum $i | cut -d " " -f 1` &amp;&amp; sha1=`sh a1sum $i | cut -d " " -f
 1` &amp;&amp; echo FWD: `stat --printf "%s:%a:%u:%g" $i`:$md5:$sha1 $i; done; exit
INFO: Starting.
FWD: 833:644:0:0:4148adea745af5121963f6b731b60013:60877a6f6981b16c0d53d32bcd3f07d41cfb5bd4 /etc/modprobe.d/
glib2.sh
[...........SNIP............]
FWD: 1696:644:0:0:c2bd306b205ad9e81fb02ce6b225d384:5244d65815cb228a4fac7bc4c1c7774508fb7505 /etc/nsswitch.conf
FWD: 85179:644:0:0:8db574225cd1068b47e77ceccd96f8ff:b5ef6183b35ee9d1b66ed2cefe98003c5bd99192 /etc/sensors.conf
FWD: 49:644:0:0:52c3df2f1edf30ca3db82174be3a68d2:1934648f2429b70b1f729d343a6956fb0ea73136 /etc/php.d/imap.ini
FWD: 873:644:0:0:04559d1fe27ecd079b69df8b319f937e:e5cab1bf1f9e4bc4386309f4e00a9b7be3e543a2 /etc/php.d/memcache.ini
FWD: 59:644:0:0:94636ba6c4bac9d8d49d9de1a513ae0c:41d5164a2c6e332e40edf55c59a2d0df8a260964 /etc/php.d/pdo_mysql.ini
FWD: 49:644:0:0:917dbbafbfaaa20f660063d627123dae:0e829d4ffc69f58dc258510b4b8452412e31ccc5 /etc/php.d/json.ini
FWD: 0:644:0:0:d41d8cd98f00b204e9800998ecf8427e:da39a3ee5e6b4b0d3255bfef95601890afd80709 /etc/wvdial.conf
logout
Connection to 172.17.20.20 closed.

INFO: Finished.
</code></pre>

<h2 id="ssh_dmz_linux">Our own Agentless Script: ssh_dmz_linux</h2>

<p>Using the built in OSSEC agentless scripts are great, but sometimes we need more focused scanning and checking.  So let&#8217;s modify the <code>ssh_integrity_check_linux</code> for our environment.</p>

<p>The goals for this new script will be to watch for changes to files based on the following criteria:</p>

<ul>
<li>All setuid and setgid files</li>
<li>All files related to authentication (including .htaccess and ssh files)</li>
<li>All application specific files (apache, ssh)</li>
</ul>

<h4 id="finding_setuid_setgid">Finding all setuid and setgid files</h4>

<p>Let&#8217;s first start by identifying a method to locate all files with their setuid or setgid bits enabled.  To do this we will ssh to the host <code>172.17.20.20</code> and use <code>find</code> to locate the files.</p>

<pre><code>obsd46# sudo -u ossec ssh root@172.17.20.20
[linux26 ~]# find / -type f \( -perm -4000 -o -perm -2000 \) 
/sbin/umount.nfs
/sbin/netreport
/sbin/unix_chkpwd
/sbin/mount.nfs
/sbin/pam_timestamp_check
/sbin/mount.nfs4
/sbin/umount.nfs4
/bin/ping6
/bin/su
/bin/umount
/bin/ping
/bin/mount
/lib/dbus-1/dbus-daemon-launch-helper
/usr/libexec/openssh/ssh-keysign
/usr/libexec/utempter/utempter
/usr/sbin/usernetctl
/usr/sbin/postqueue
/usr/sbin/userhelper
/usr/sbin/userisdnctl
/usr/sbin/postdrop
/usr/sbin/suexec
/usr/bin/chsh
/usr/bin/chfn
/usr/bin/sudo
/usr/bin/locate
/usr/bin/wall
/usr/bin/sudoedit
/usr/bin/gpasswd
/usr/bin/lockfile
/usr/bin/newgrp
/usr/bin/write
/usr/bin/screen
/usr/bin/passwd
/usr/bin/chage
/usr/bin/sperl5.8.8
/usr/bin/crontab
/usr/bin/ssh-agent
</code></pre>

<h4 id="finding_app_files">Finding all files related to authentication and applications specific files</h4>

<p>Finding all files with setuid and setgid was simple, but finding all files related to authentication is more invloved. This of course will vary from system to system, but this should be good starting point.</p>

<pre><code>obsd46# sudo -u ossec ssh root@172.17.20.20
[linux26 ~]# find / \( -name ".ssh" -o -name "ssh" -o -name "sshd" -o -name "httpd" -o -name ".htaccess" 
-o -name "pam.d" \) -exec find {} \;
/var/www/html/admin/modules/framework/var/www/html/admin/modules/.htaccess
/etc/httpd
/etc/httpd/conf
/etc/httpd/conf.d
/etc/httpd/conf.d/php.conf
/etc/httpd/conf.d/proxy_ajp.conf
/etc/httpd/conf.d/README
/etc/httpd/conf.d/ssl.conf
/etc/httpd/conf.d/welcome.conf
/etc/httpd/conf/httpd.conf
/etc/httpd/conf/magic
/etc/httpd/logs
/etc/httpd/modules
/etc/httpd/run
/etc/logrotate.d/httpd
/etc/pam.d
/etc/pam.d/authconfig
[...................SNIP PAM Files.....................]
/etc/pam.d/system-config-network-cmd
/etc/pam.d/vsftpd
/etc/rc.d/init.d/httpd
/etc/rc.d/init.d/sshd
/etc/ssh
/etc/ssh/ssh_config
/etc/ssh/sshd_config
/etc/ssh/ssh_host_dsa_key
/etc/ssh/ssh_host_dsa_key.pub
/etc/ssh/ssh_host_key
/etc/ssh/ssh_host_key.pub
/etc/ssh/ssh_host_rsa_key
/etc/ssh/ssh_host_rsa_key.pub
/etc/sysconfig/httpd
/root/.ssh
/root/.ssh/authorized_keys
/usr/bin/ssh
/usr/lib/httpd
/usr/lib/httpd/modules
/usr/lib/httpd/modules/libphp5.so
[...................SNIP Apache modules................]

/usr/lib/httpd/modules/mod_vhost_alias.so
/usr/sbin/httpd
/usr/sbin/sshd
/usr/src/tbm-pbxconfig-5.5.1/amp_conf/htdocs/admin/modules/framework/htdocs/admin/modules/.htaccess
/usr/src/tbm-pbxconfig-5.5.1/amp_conf/htdocs/admin/modules/.htaccess
/var/empty/sshd
/var/empty/sshd/etc
/var/empty/sshd/etc/localtime
/var/www/html/admin/modules/framework/var/www/html/admin/modules/.htaccess
/var/www/html/admin/modules/.htaccess
</code></pre>

<h4 id="merging_finds">Merging finds</h4>

<p>Now we have two basic <code>find</code> methods that identify the files we want to monitor for changes, but our finds were a little greedy so we should create a way to strip out unwanted files from the list.  As this is a unix system <code>egrep</code> is the king for finding or removing items from a list.  To simplify things we can use <code>egrep</code> with the <code>-v</code> command line argument which tells <code>egrep</code> <strong>NOT</strong> to print any matching items.</p>

<p>Just to make sure that we do not end up double processing files we can make use of the <code>sort</code> command with <code>-u</code> argument to remove any duplicates.</p>

<p>Here is how we would put together both <code>find</code>s, <code>egrep</code>, and <code>sort</code> to locate and filter what is needed.</p>

<pre><code>(find / -type f \( -perm -4000 -o -perm -2000 \) &amp;&amp; \find / \( -name ".ssh" -o -name "ssh" -o -name "sshd" 
-o -name "httpd" -o -name ".htaccess" -o -name "pam.d" \) -exec find {} \; ) 2&gt;/dev/null | egrep 
-v "known_hosts|moduli|var\/log|var\/lock" | sort -u
</code></pre>

<p>The above command we have found all files and paths that we would like to monitor, but this still needs to be integrated into a script on the OSSEC server.</p>

<h2 id="creating_ssh_dmz_linux">Creating ssh_dmz_linux</h2>

<p>We don&#8217;t want to make changes to <code>ssh_integrity_check_linux</code> directly so we will need to make a copy.</p>

<pre><code>obsd46# (cd /var/ossec/agentless &amp;&amp; cp ssh_integrity_check_linux ssh_dmz_linux)
</code></pre>

<p>Integrating our new command line into the script we must pay close attention to special characters that <code>expect</code> will process.  Due to this we will need to escape all <code>/</code> and <code>"</code> by proceeding them with <code>\</code>.   Once we are done escaping we just insert our new line in place of <code>find $args 2&gt;/dev/null</code> in our new file.</p>

<p>Here is what the completed script will look like.</p>

<pre><code>obsd56# cat /var/ossec/agentless/ssh_dmz_linux
 #!/usr/bin/env expect

 # @(#) $Id: ssh_integrity_check_linux,v 1.11 2009/06/24 17:06:21 dcid Exp $
 # Agentless monitoring
 #
 # Copyright (C) 2009 Trend Micro Inc.
 # All rights reserved.
 # 
 # This program is a free software; you can redistribute it
 # and/or modify it under the terms of the GNU General Public
 # License (version 3) as published by the FSF - Free Software
 # Foundation.


 # Main script.
source "agentless/main.exp"


 # SSHing to the box and passing the directories to check.
if [catch {
    spawn ssh $hostname
} loc_error] {
    send_user "ERROR: Opening connection: $loc_error.\n"
    exit 1;
}


source $sshsrc
source $susrc

set timeout 600
send "echo \"INFO: Starting.\"; for i in `(find / \\( -name \".ssh\" -o -name \"ssh\" -o -name \"sshd\" 
-o -name \"httpd\" -o -name \".htaccess\" -o -name \"pam.d\" \\) -exec find {} \\; &amp;&amp; find / -type f 
\\( -perm -4000 -o -perm -2000 \\); ) 2&gt;/dev/null | egrep -v \"known_hosts|moduli|var\\/log|var\\/lock\" | sort -u`;
do tail \$i &gt;/dev/null 2&gt;&amp;1 &amp;&amp; md5=`md5sum \$i | cut -d \" \" -f 1` &amp;&amp; sha1=`sha1sum \$i | cut -d \" \" 
-f 1` &amp;&amp; echo FWD: `stat --printf \"%s:%a:%u:%g\" \$i`:\$md5:\$sha1 \$i; done; exit\r"
send "exit\r"

expect {
    timeout {
        send_user "ERROR: Timeout while running commands on host: $hostname .\n"
        exit 1;
    }
    eof {
        send_user "\nINFO: Finished.\n"
        exit 0;
    }
}

exit 0;
</code></pre>

<h4 id="testing_ssh_dmz_linux">Testing</h4>

<p>Before we add this new script to OSSEC configuration we need to test it.</p>

<pre><code>obsd46# (cd /var/ossec &amp;&amp; sudo -u ossec ./agentless/ssh_dmz_linux root@172.17.20.20 )

ERROR: ssh_integrity_check &lt;hostname&gt; &lt;arguments&gt;
</code></pre>

<p>Due to not making use of the of the <code>$arg</code> variable in the way that <code>ssh_integrity_check_linux</code> wants use too, this caused this the problem above.  Solving this problem would require making changes to files that will effect other built in scripts.  So a quick solution is to just pass anything as an argument to the script.  This will have no effect on our script as we do not make use of the <code>$arg</code> variable.</p>

<pre><code>obsd46# (cd /var/ossec &amp;&amp; sudo -u ossec ./agentless/ssh_dmz_linux root@172.17.20.20 NOTUSED)
spawn ssh root@172.17.20.20
Last login: Wed Nov  4 13:46:32 2009 from 172.17.20.131^M
[linux26 ~]#  
INFO: Started.
echo "INFO: Starting."; for i in `(find / \( -name ".ssh" -o -name "ssh" -o -name "sshd" -o -name "httpd" 
-o -name ".htaccess" -o -name "pam.d" \)  -exec find {} \; &amp;&amp; find / -type f \( -perm -4000 -o -perm -2000 
\); ) 2&gt;/dev/null | egrep -v "known_hosts|moduli|var\/log|var\/lock"`;do tail $i &gt;/dev/null 2&gt;&amp;1 &amp;&amp;
 md5=`md5s ^Mum $i | cut -d " " -f 1` &amp;&amp; sha1=`sha1sum $i | cut -d " " -f 1` &amp;&amp; echo FWD: `stat --printf 
"%s:%a:%u:%g" $i`:$md5:$sha1 $i; done; exit
INFO: Starting.
FWD: 14:775:100:101:3bc0a3e92f8170084dd102eda9a474b1:25a1783a3c6bdd9745ec245ec1bfa0414ee05d23 /var/www/html/admin/modules/.htaccessmodules/.htaccess
FWD: 3519:644:0:0:e4ca381035a34b7a852184cc0dd89baa:6e43d0b5a46ed5ba78da5c7e9dcf319b27d769e7 /var/empty/sshd/etc/localtime
FWD: 560:644:0:0:58370830ecfa056421ad21aff9c18905:d115bb5aeefaab97c53fbbd5df84ebcb9170d796 /etc/httpd/conf.d/php.conf
[...................SNIP.............................]
FWD: 392:644:0:0:e92bea7e9d70a9ecdc61edd7c0a2f59a:d77b61dac010c60589b4d8a2039e3b8a5bed18b2 /etc/httpd/conf.d/README
FWD: 70888:4711:0:0:9046bd13339e7ef22266067b633e601a:3fc41029ddb14fe4ed613f479fa9e89c944f04dd /usr/bin/sperl5.8.8
FWD: 315416:6755:0:0:4c63a9709fb7f0f97c30aa29d204859c:c379efa658de72866b8f6de5767906ff78d127b0 /usr/bin/crontab
FWD: 88964:2755:0:99:baf3ebef6377d6ef42858776c33621b0:62394bf57d18c3fd49adeb39a1da61661cabc3c8 /usr/bin/ssh-agent
logout
Connection to 172.17.20.20 closed.

INFO: Finished.

</code></pre>

<h4 id="going_live">Going live</h4>

<p>We have created a new OSSEC agentless script and I am going to enable this script using the <a href="http://bitbucket.org/jrossi/ossec-hids-tools/">ossec-hids-tools</a> that I introduced in my last post about ossec (<a href="/archives/2009/11/ossec-agentless-to-save-the-day/">OSSEC: Agentless to save the day</a>).   Also a restart of OSSEC will also be needed for the changes to take effect.</p>

<pre><code>obsd46# ossec-config --section agentless --add --host root@172.17.20.20 --type ssh_dmz_linux 
--state periodic --argv "NOTUSED"
obsd46# /var/ossec/bin/ossec-control restart                                                                                                        (root@jcli-1:/var/ossec)
Killing ossec-monitord .. 
Killing ossec-logcollector .. 
Killing ossec-remoted .. 
Killing ossec-syscheckd .. 
Killing ossec-analysisd .. 
Killing ossec-maild .. 
ossec-execd not running ..
Killing ossec-agentlessd .. 
OSSEC HIDS v2.2 Stopped
Starting OSSEC HIDS v2.2 (by Trend Micro Inc.)...
Started ossec-agentlessd...
Started ossec-maild...
Started ossec-execd...
Started ossec-analysisd...
Started ossec-logcollector...
Started ossec-remoted...
Started ossec-syscheckd...
Started ossec-monitord...
Completed.
</code></pre>

<p><strong>Related Posts:</strong></p>
<ul>
<li><a href="http://praetorianprefect.com/archives/2010/06/iphone-4-ordering-and-session-switching/">iPhone 4 Ordering and Session Switching</a></li>
<li><a href="http://praetorianprefect.com/archives/2010/05/mays-patch-tuesday/">May&#8217;s Patch Tuesday</a></li>
<li><a href="http://praetorianprefect.com/archives/2010/03/3473/">March&#8217;s Patch Tuesday</a></li>
<li><a href="http://praetorianprefect.com/archives/2010/03/press-f1-for-help-pwned/">Press F1 for Help, pwned.</a></li>
<li><a href="http://praetorianprefect.com/archives/2010/01/first-patch-tuesday-of-2010/">First Patch Tuesday of 2010</a></li>
</ul><br />
]]></content:encoded>
			<wfw:commentRss>http://praetorianprefect.com/archives/2009/11/ossec-agentless-scripts/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
