MiracleLinux ; SNORT ,Tripwire , Checkrootkit

Install  SNORT

1.Preliminary preparations

①Add the CodeReady Red Hat repository and install the required software

# dnf -y install bison flex libpcap-devel pcre-devel openssl-devel libdnet-devel libtirpc-devel libtool nghttp2 libnghttp2-devel
# mkdir /var/src
②Install DAQ
# cd /var/src
# wget https://snort.org/downloads/snort/daq-2.0.7.tar.gz
# tar zxvf daq-2.0.7.tar.gz
# cd daq-2.0.7
# autoreconf -f -i
# ./configure
# make
# make install
③Install Lua
# cd /var/src
# wget http://luajit.org/download/LuaJIT-2.0.5.tar.gz
# tar -zxvf LuaJIT-2.0.5.tar.gz
# cd LuaJIT-2.0.5
# make
# make install
④Create a fake release file
# /bin/cat << EOT >/etc/fedora-release
Fedora release 28 (Rawhide)

2. Download, compile, and install Snort.

# cd /var/src
# wget https://snort.org/downloads/archive/snort/snort-
# tar -zxvf snort-
# cd snort-
# ./configure –enable-sourcefire
# make
# make install
# ldconfig
# ln -s /usr/local/bin/snort /usr/sbin/snort
Remove the fake release file
# rm /etc/fedora-release

3.Create grooves and users, and create necessary directories and files.

# groupadd snort
# useradd snort -r -s /sbin/nologin -c SNORT_IDS -g snort

# mkdir /etc/snort
# mkdir -p /etc/snort/rules
# mkdir /var/log/snort
# mkdir /usr/local/lib/snort_dynamicrules
# mkdir /etc/snort/preproc_rules

# chmod -R 5775 /etc/snort
# chmod -R 5775 /var/log/snort
# chmod -R 5775 /usr/local/lib/snort_dynamicrules
# chown -R snort:snort /etc/snort
# chown -R snort:snort /var/log/snort
# chown -R snort:snort /usr/local/lib/snort_dynamicrules

Create the following file
# touch /etc/snort/rules/white_list.rules
# touch /etc/snort/rules/black_list.rules
# touch /etc/snort/rules/local.rules

Set up the configuration files… Copy all files to the configuration directory.

# cp /var/src/snort-*.conf* /etc/snort
# cp /var/src/snort-*.map* /etc/snort

4.Use of community rules

①Get community rules

# wget https://www.snort.org/rules/community -O ~/community.tar.gz
②Extract the rules and copy them to the configuration folder
# tar -xvf ~/community.tar.gz -C ~/
# cp ~/community-rules/* /etc/snort/rules
There are various rule files that are not included in the community rules.
Use the sed command to comment out unnecessary lines.
# sed -i ‘s/include \$RULE\_PATH/#include \$RULE\_PATH/’ /etc/snort/snort.conf

5. Get registered user rules

If you register on the Snort website, you can use an Oink code to download the registered user rules.
The Oink code can be found in your Snort user account details.
Replace oinkcode with your personal code in the following command.
# wget https://www.snort.org/rules/snortrules-snapshot-29181.tar.gz?oinkcode=<oink-code> -O ~/registered.tar.gz

Once the download is complete, extract the rules to the configuration directory

# tar -xvf ~/registered.tar.gz -C /etc/snort

6. Configure networks and rules

# vi /etc/snort/snort.conf
●Line 45
# Setup the network addresses you are protecting
ipvar HOME_NET ←Adapt to your own environment
●Line 48
# Set up the external network addresses. Leave as “any” in most situations
●Line 104-106: Comment out and add below.
# Path to your rules files (this can be a relative path)
# var RULE_PATH ../rules
# var SO_RULE_PATH ../so_rules
# var PREPROC_RULE_PATH ../preproc_rules
var RULE_PATH /etc/snort/rules
var SO_RULE_PATH /etc/snort/so_rules
var PREPROC_RULE_PATH /etc/snort/preproc_rules
●Per line 116 :Comment out and add below.
# Set the absolute path appropriately
#var WHITE_LIST_PATH ../rules
#var BLACK_LIST_PATH ../rules
var WHITE_LIST_PATH /etc/snort/rules
var BLACK_LIST_PATH /etc/snort/rules
●Per line526; add
# unified2
# Recommended for most installs
output unified2: filename snort.log, limit 128
●Line 550: To allow custom rules to be loaded, local.rules needs to be uncommented
include $RULE_PATH/local.rules
●If you are using community rules, also add the following line just below the local.rules line
include $RULE_PATH/community.rules

7. Verify the configuration

Use the parameter -T to test the configuration and enable the test mode

# snort -T -c /etc/snort/rules/snort.conf

MaxRss at the end of detection rules:809420

–== Initialization Complete ==–

,,_       -*> Snort! <*-
o” )~    Version GRE (Build 1005)
””       By Martin Roesch & The Snort Team: http://www.snort.org/contact#team
Copyright (C) 2014-2021 Cisco and/or its affiliates. All rights reserved.
Copyright (C) 1998-2013 Sourcefire, Inc., et al.
Using libpcap version 1.9.1 (with TPACKET_V3)
Using PCRE version: 8.45 2021-06-15
Using ZLIB version: 1.2.11

Rules Engine: SF_SNORT_DETECTION_ENGINE Version 3.2 <Build 1>
Preprocessor Object: SF_DNS Version 1.1 <Build 4>
Preprocessor Object: appid Version 1.1 <Build 5>
Preprocessor Object: SF_S7COMMPLUS Version 1.0 <Build 1>
Preprocessor Object: SF_FTPTELNET Version 1.2 <Build 13>
Preprocessor Object: SF_POP Version 1.0 <Build 1>
Preprocessor Object: SF_SSLPP Version 1.1 <Build 4>

Total snort Fixed Memory Cost – MaxRss:809420
Snort successfully validated the configuration!
Snort exiting

If an error occurs, copy the corresponding file to /etc/snort/rules.
In our case, the error occurred with the following files
# cp /var/src/snort- /etc/snort/rules
cp /var/src/snort- /etc/snort/rules
cp /var/src/snort- /etc/snort/rules
cp /var/src/snort- /etc/snort/rules/
If you get a unicode.map error
# cp /usr/local/src/snort- /etc/snort/rules

8. Test the configuration

①To test if Snort is logging alerts, add a custom detection rule alert for incoming ICMP connections to the local.rules file.
# vi /etc/snort/rules/local.rules
●Add the following line to the last line
alert icmp any any -> $HOME_NET any (msg:”ICMP test”; sid:10000001; rev:001;)
②Start Snort in the console and output the alert to stdout.
You need to select the correct network interface (e.g. eth0)

# snort -A console -i eth0 -u snort -g snort -c /etc/snort/snort.conf

With Snort up and running, perform a ping from another computer.
The terminal where Snort is running will display the following notification for each ICMP call

Commencing packet processing (pid=39981)
01/22-17:35:31.748180 [**] [1:10000001:1] ICMP test [**] [Priority: 0] {ICMP} ->
01/22-17:35:31.748233 [**] [1:10000001:1] ICMP test [**] [Priority: 0] {ICMP} ->
01/22-17:35:32.761756 [**] [1:10000001:1] ICMP test [**] [Priority: 0] {ICMP} ->
01/22-17:35:32.761786 [**] [1:10000001:1] ICMP test [**] [Priority: 0] {ICMP} ->
01/22-17:35:33.764377 [**] [1:10000001:1] ICMP test [**] [Priority: 0] {ICMP} ->
01/22-17:35:33.764408 [**] [1:10000001:1] ICMP test [**] [Priority: 0] {ICMP} ->
01/22-17:35:34.768669 [**] [1:10000001:1] ICMP test [**] [Priority: 0] {ICMP} ->
01/22-17:35:34.768699 [**] [1:10000001:1] ICMP test [**] [Priority: 0] {ICMP} ->

9. Run Snort in the background.

①Create a startup script for Snort.

# vi /lib/systemd/system/snort.service

[Unit] Description=Snort NIDS Daemon
After=syslog.target network.target

[Service] Type=simple
ExecStart=/usr/local/bin/snort -q -u snort -g snort -c /etc/snort/snort.conf -i eth0

[Install] WantedBy=multi-user.target

②After defining the service, reload and run the systemctl daemon

# systemctl daemon-reload
# systemctl start snort

Install Tripwire

1.Download and install

# cd /usr/local/src
# wget https://rpmfind.net/linux/epel/8/Everything/x86_64/Packages/t/tripwire-
# rpm -Uvh tripwire-


Set the site passphrase and local passphrase.

# tripwire-setup-keyfiles
The Tripwire site and local passphrases are used to sign a variety of
files, such as the configuration, policy, and database files.
Passphrases should be at least 8 characters in length and contain both
letters and numbers.
See the Tripwire manual for more information.
Creating key files…
(When selecting a passphrase, keep in mind that good passphrases typically
have upper and lower case letters, digits and punctuation marks, and are
at least 8 characters in length.)
Enter the site keyfile passphrase: ←Enter any “Site Passphrase”.
Verify the site keyfile passphrase: ←Enter any “Site Passphrase” again
Generating key (this may take several minutes)…Key generation complete.
(When selecting a passphrase, keep in mind that good passphrases typically
have upper and lower case letters, digits and punctuation marks, and are
at least 8 characters in length.)
Enter the local keyfile passphrase: ←Enter any “Local Passphrase”.
Verify the local keyfile passphrase: ←Enter any “Local Passphrase” again
Generating key (this may take several minutes)…Key generation complete.
Signing configuration file…
Please enter your site passphrase: ← Enter  “Site Passphrase”.
Wrote configuration file: /etc/tripwire/tw.cfg
A clear-text version of the Tripwire configuration file:
has been preserved for your inspection. It is recommended that you
move this file to a secure location and/or encrypt it in place (using a
tool such as GPG, for example) after you have examined it.
Signing policy file…
Please enter your site passphrase: ← Enter  “Site Passphrase”.
Wrote policy file: /etc/tripwire/tw.pol
A clear-text version of the Tripwire policy file:
default values from the current configuration file are used.

3.Configuring Tripwire

①Edit configuration file

# vi /etc/tripwire/twcfg.txt
●Per line9
Add “#” to the beginning of the line and “LOOSEDIRECTORYCHECKING =true” to the line below it.
●Per line13
Add “#” to the beginning of the line, and add “REPORTLEVEL =4” to the line below it.
②Create a Tripwire configuration file (cryptographically signed version)
# twadmin -m F -c /etc/tripwire/tw.cfg -S /etc/tripwire/site.key /etc/tripwire/twcfg.txt
Please enter your site passphrase: ←Enter the site passphrase you set.
Wrote configuration file: /etc/tripwire/tw.cfg
③Delete Tripwire configuration file (text version)
# rm -f /etc/tripwire/twcfg.txt
④Policy file settings
# cd /etc/tripwire/
# vi twpolmake.pl
Contents of twpolmake.pl

# Tripwire Policy File customize tool
# —————————————————————-
# Copyright (C) 2003 Hiroaki Izumi
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place – Suite 330, Boston, MA 02111-1307, USA.
# —————————————————————-
# Usage:
# perl twpolmake.pl {Pol file}
# —————————————————————-

open(POL,”$POLFILE”) or die “open error: $POLFILE” ;
my($myhost,$thost) ;
my($sharp,$tpath,$cond) ;
my($INRULE) = 0 ;

while (<POL>) {
if (($thost) = /^HOSTNAME\s*=\s*(.*)\s*;/) {
$myhost = `hostname` ; chomp($myhost) ;
if ($thost ne $myhost) {
$_=”HOSTNAME=\”$myhost\”;” ;
elsif ( /^{/ ) {
elsif ( /^}/ ) {
elsif ($INRULE == 1 and ($sharp,$tpath,$cond) = /^(\s*\#?\s*)(\/\S+)\b(\s+->\s+.+)$/) {
$ret = ($sharp =~ s/\#//g) ;
if ($tpath eq ‘/sbin/e2fsadm’ ) {
$cond =~ s/;\s+(tune2fs.*)$/; \#$1/ ;
if (! -s $tpath) {
$_ = “$sharp#$tpath$cond” if ($ret == 0) ;
else {
$_ = “$sharp$tpath$cond” ;
print “$_\n” ;
close(POL) ;

⑤Policy file optimization

# perl /etc/tripwire/twpolmake.pl /etc/tripwire/twpol.txt > /etc/tripwire/twpol.txt.new
⑥Create a policy file (cryptographically signed version) based on the optimized policy file.
# twadmin -m P -c /etc/tripwire/tw.cfg -p /etc/tripwire/tw.pol -S /etc/tripwire/site.key /etc/tripwire/twpol.txt.new
Please enter your site passphrase: ←Enter your site passphrase
Wrote policy file: /etc/tripwire/tw.pol
⑦Create a database and check its operation.
# tripwire -m i -s -c /etc/tripwire/tw.cfg
Please enter your local passphrase: ←Enter the local passphrase you set. 

Create a test file
# echo test > /root/test.txt 

Check Tripwire operation
# tripwire -m c -s -c /etc/tripwire/tw.cfg 

Delete the test file
# rm -f /root/test.txt

⑧Tripwire Periodic Execution Script
# cd /var/www/system
# vi tripwire.sh
Contents of tripwire.sh



# Set passphrase
LOCALPASS= ←local passphrase
SITEPASS=  ←Site passphrase

cd /etc/tripwire

# Run a Tripwire check
tripwire -m c -s -c tw.cfg|mail -s “Tripwire(R) Integrity Check Report in `hostname`” root

# Update policy files
twadmin -m p -c tw.cfg -p tw.pol -S site.key > twpol.txt
perl twpolmake.pl twpol.txt > twpol.txt.new
twadmin -m P -c tw.cfg -p tw.pol -S site.key -Q $SITEPASS twpol.txt.new > /dev/null
rm -f twpol.txt* *.bak

# Database modernization
rm -f /usr/local/tripwire/lib/tripwire/*.twd*
tripwire -m i -s -c tw.cfg -P $LOCALPASS

⑨Tripwire AutoRun Script Execution Settings

# chmod 700 tripwire.sh

Add to cron
# crontab -e
0 3 * * * /var/www/system/tripwire.sh

When running “/var/www/system/tripwire.sh” and it says there is no mail command
# dnf install mailx
# systemctl start postfix

# mail

Install chkrootkit

①Download and install

# cd /usr/local/src
# wget ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.tar.gz
# tar zxvf chkrootkit.tar.gz
➁Create a /root/bin directory and move the chkrootkit command to that directory
# mkdir -p /root/bin
# mv chkrootkit-0.55/chkrootkit /root/bin
➂Check chkrootkit.
# chkrootkit | grep INFECTED
④Create and change permissions of the chkrootkit regular execution script
# vi /var/www/system/chkrootkit.sh
Contents of chkrootkit.sh




# Run chkrootkit
chkrootkit > $TMPLOG

# Log output
cat $TMPLOG | logger -t chkrootkit

# Handling of SMTPS bindshell false positives
if [ ! -z “$(grep 465 $TMPLOG)” ] && \
[ -z $(/usr/sbin/lsof -i:465|grep bindshell) ]; then
sed -i ‘/465/d’ $TMPLOG

# Addressed Suckit false positive when updating upstart package.
#if [ ! -z “$(grep Suckit $TMPLOG)” ] && \
# [ -z $(rpm -V `rpm -qf /sbin/init`) ]; then
# sed -i ‘/Suckit/d’ $TMPLOG

# Send mail to root only when rootkit is detected
[ ! -z “$(grep INFECTED $TMPLOG)” ] && \
grep INFECTED $TMPLOG | mail -s “chkrootkit report in `hostname`” root

rm -f $TMPLOG

# chmod 700 /var/www/system/chkrootkit.sh
⑤Register in cron to be executed periodically.
# crontab -e
0 2 * * * /var/www/system/chkrootkit.sh