What is a shebang in Linux?

shebang script explained

Known as a a shebang or a bang line, this is just the characters at the very start of a Linux script. It is simply a hash or number sign followed by an exclamation point character (#!). This is then followed by the full path to the interpreter, for example /bin/bash

Think of it as a necessary code mark that tells the system the absolute path to the Bash interpreter and you’ll not have a problem.

More info on how to use and execute Linux scripts here


Install mod_GeoIP2 on Apache2 in CentOS 7

geoip-centos

If you need to install the excellent mod_geoip2 extension for Apache2 then it can be done fairly painlessly. First off, we need to make sure that we have gcc installed:

 

If you don’t have it then you could ‘yum install gcc’, but I prefer to install all development tools because they include gcc anyway:

 

Install the GeoIP development package

 

Install mod_geoip2 by fetching the latest version with wget. To check the latest version, take a look here first:

https://github.com/maxmind/geoip-api-mod_geoip2/releases

 

I’m installing 1.2.10 here with this, but replace the code in lines 1, 2 and 3 here with their latest version:

 

Now we use the apxs (Apache Extension Tool) to build our extension modules for Apache:

 

If you haven’t got apxs then you’ll need to install httpd-devel.

Be aware that this overwrites httpd so backup your server in case this fails or you get strange results.

 

If this fails with “Error: Nothing to do”, then it’s fairly common. You’ll probably find that /etc/yum.conf is blocking the installation. We can get around this by either editing the configuration file or typing:

 

You should now have mod_geoip2 installed on your server!


Reset Windows Server 2012 Administrator password

server 2012 password resetTo reset the Administrator password on your Windows server 2012 installation, you’ll need to do the following:

Boot from the Microsoft Windows Server 2012 DVD

  1. From the Windows setup menu, click “Next”
  2. Select “Repair your computer”
  3. Click on “Troubleshoot”
  4. Under Advanced options, click “Command Prompt”
  5. Type “diskpart” and hit Enter
  6. Type “list volume” and hit Enter. This will show you your (current) drive letter allocated to the drive where Windows is installed. Note  – if you don’t see any volumes listed and this is the first boot cycle for a new Server 2012 installation, then I have seen this on a few HP servers and you’ll need to go and run the setup again from within the Intelligent Provisioning area.
  7. Make a note of the drive letter and type “exit” then press enter to leave diskpart (but stay in the command prompt window)
  8. Presuming the letter is d, then type “d:” and press enter to change to this drive
  9. Now type  “cd Windows\system32” and press enter which will take you into the system32 folder
  10. Type “ren Utilman.exe Utilman.bak” and press enter
  11. Type “copy cmd.exe Utilman.exe” and press enter
  12. Close the command prompt and then click “Continue”
  13. The server should now reboot to the logon screen. Press the Windows key + u to open a command prompt
  14. At the prompt you can change the password by typing “net user administrator xyz” where xyz is your new super-secure password!
  15. Now, for security we must do one last thing. Once we are back in Windows, open Explorer, navigate to Windows\system32 and rename Utilman.bak to Utilman.exe

 

Hopefully this gets you out of a sticky situation, leave me a comment if it has helped.

 


Country codes for mod_security, CSF and htaccess

Her’s a list of useful country codes that we can use in many rule-based filtering situations on servers.

AD Andorra
AE United Arab Emirates
AF Afghanistan
AG Antigua and Barbuda
AI Anguilla
AL Albania
AM Armenia
AN Netherlands Antilles
AO Angola
AQ Antarctica
AR Argentina
AS American Samoa
AT Austria
AU Australia
AW Aruba
AZ Azerbaijan
BA Bosnia and Herzegovina
BB Barbados
BD Bangladesh
BE Belgium
BF Burkina Faso
BG Bulgaria
BH Bahrain
BI Burundi
BJ Benin
BM Bermuda
BN Brunei Darussalam
BO Bolivia
BR Brazil
BS Bahamas
BT Bhutan
BV Bouvet Island
BW Botswana
BY Belarus
BZ Belize
CA Canada
CC Cocos (Keeling) Islands
CF Central African Republic
CG Congo
CH Switzerland
CI Cote D’Ivoire (Ivory Coast)
CK Cook Islands
CL Chile
CM Cameroon
CN China
CO Colombia
CR Costa Rica
CS Czechoslovakia (former Republic)
CU Cuba
CV Cape Verde
CX Christmas Island
CY Cyprus
CZ Czech Republic
DE Germany
DJ Djibouti
DK Denmark
DM Dominica
DO Dominican Republic
DZ Algeria
EC Ecuador
EE Estonia
EG Egypt
EH Western Sahara
ER Eritrea
ES Spain
ET Ethiopia
FI Finland
FJ Fiji
FK Falkland Islands (Malvinas)
FM Micronesia
FO Faroe Islands
FR France
FX France, Metropolitan
GA Gabon
GB Great Britain (UK)
GD Grenada
GE Georgia
GF French Guiana
GH Ghana
GI Gibraltar
GL Greenland
GM Gambia
GN Guinea
GP Guadeloupe
GQ Equatorial Guinea
GR Greece
GS S. Georgia and S. Sandwich Isls.
GT Guatemala
GU Guam
GW Guinea-Bissau
GY Guyana
HK Hong Kong
HM Heard and McDonald Islands
HN Honduras
HR Croatia (Hrvatska)
HT Haiti
HU Hungary
ID Indonesia
IE Ireland
IL Israel
IN India
IO British Indian Ocean Territory
IQ Iraq
IR Iran
IS Iceland
IT Italy
JM Jamaica
JO Jordan
JP Japan
KE Kenya
KG Kyrgyzstan
KH Cambodia
KI Kiribati
KM Comoros
KN Saint Kitts and Nevis
KP Korea (North)
KR Korea (South)
KW Kuwait
KY Cayman Islands
KZ Kazakhstan
LA Laos
LB Lebanon
LC Saint Lucia
LI Liechtenstein
LK Sri Lanka
LR Liberia
LS Lesotho
LT Lithuania
LU Luxembourg
LV Latvia
LY Libya
MA Morocco
MC Monaco
MD Moldova
MG Madagascar
MH Marshall Islands
MK Macedonia
ML Mali
MM Myanmar
MN Mongolia
MO Macau
MP Northern Mariana Islands
MQ Martinique
MR Mauritania
MS Montserrat
MT Malta
MU Mauritius
MV Maldives
MW Malawi
MX Mexico
MY Malaysia
MZ Mozambique
NA Namibia
NC New Caledonia
NE Niger
NF Norfolk Island
NG Nigeria
NI Nicaragua
NL Netherlands
NO Norway
NP Nepal
NR Nauru
NT Neutral Zone
NU Niue
NZ New Zealand (Aotearoa)
OM Oman
PA Panama
PE Peru
PF French Polynesia
PG Papua New Guinea
PH Philippines
PK Pakistan
PL Poland
PM St. Pierre and Miquelon
PN Pitcairn
PR Puerto Rico
PT Portugal
PW Palau
PY Paraguay
QA Qatar
RE Reunion
RO Romania
RU Russian Federation
RW Rwanda
SA Saudi Arabia
Sb Solomon Islands
SC Seychelles
SD Sudan
SE Sweden
SG Singapore
SH St. Helena
SI Slovenia
SJ Svalbard and Jan Mayen Islands
SK Slovak Republic
SL Sierra Leone
SM San Marino
SN Senegal
SO Somalia
SR Suriname
ST Sao Tome and Principe
SU USSR (former)
SV El Salvador
SY Syria
SZ Swaziland
TC Turks and Caicos Islands
TD Chad
TF French Southern Territories
TG Togo
TH Thailand
TJ Tajikistan
TK Tokelau
TM Turkmenistan
TN Tunisia
TO Tonga
TP East Timor
TR Turkey
TT Trinidad and Tobago
TV Tuvalu
TW Taiwan
TZ Tanzania
UA Ukraine
UG Uganda
UK United Kingdom
UM US Minor Outlying Islands
US United States
UY Uruguay
UZ Uzbekistan
VA Vatican City State (Holy See)
VC Saint Vincent and the Grenadines
VE Venezuela
VG Virgin Islands (British)
VI Virgin Islands (U.S.)
VN Viet Nam
VU Vanuatu
WF Wallis and Futuna Islands
WS Samoa
YE Yemen
YT Mayotte
YU Yugoslavia
ZA South Africa
ZM Zambia
ZR Zaire
ZW Zimbabwe

A few lesser-used ones below, but for completeness here they are:

ARPA Arpanet
COM US Commercial
EDU US Educational
GOV US Government
INT International
MIL US Military
NATO Nato field
NET Network
ORG Non-Profit Organization


Scan a Linux server for viruses and malware

linux server virus scan

 

This article tries to explain, using my own experience of server management, how to scan a Linux server for viruses and malware.

 

You are probably here because you have something on your server already, very often pushing out spam emails to people via php files. Or maybe you have fallen victim to the Hacking Holy Grail – the attacker now has root access to your server. Let’s stop that now, eh?

This tutorial has screenshots from a CentOS server and this is what I used to create this guide. Your server may well be different but the principles I use are the same, you may have some detail changes to make regarding file paths. If you don’t understand anything drop me a comment or use a search engine to find your answer quickly.

Let’s start by running a virus scan with ClamAV, a free and useful antivirus. Presuming that it is not installed we would need to do this (skip to your OS below or jump to updating definitions if it is already installed):

Installing ClamAV on CentOS 5

Install EPEL5 http://fedoraproject.org/wiki/EPEL/FAQ#howtouse

Now we can install ClamAV using the yum package manager

Now turn on and start the clamd daemon

Installing ClamAV on CentOS 6

Install EPEL6 http://fedoraproject.org/wiki/EPEL/FAQ#howtouse

Install ClamAV using the yum package manager

Now turn on and start the clamd daemon

Installing ClamAV on Ubuntu/Debian/Mint

Install ClamAV using the apt-get package manager

The latest installer automatically creates default configuration files and launches the freshclam and clamd daemons. You don’t have to do anything else here which is a nice touch.

Righto, now let’s update the virus definitions…

Updating ClamAV virus definitions

For the sake of brevity, I’m presuming CentOS 6 from now on but it will be the same or similar for most Linux derivatives.

In /usr/local/cpanel/3rdparty/bin/ we can run this to get the latest definitions:

And now we can do a full scan with a full report sent to a log file of our choice:

/usr/local/cpanel/3rdparty/bin/clamscan -ri -l /path/to/log.file -r /path/to/be/scannned

For example:

Note: The tilde character denotes the home directory for that user and the wildcard (asterisk) denotes all users in the home directory. If you want to scan a single user’s home directory then simply put their name where the wildcard is.

In the files above we use some switches.

  • -r means that we recurse the subdirectories
  • –i means Clamscan will only list infected files (chained together with recurse above we get -ri)
  • -l means that Clamscan will log to the path you choose after it

For more help, run /usr/local/cpanel/3rdparty/bin/clamscan –help

Now it’s coffee time as your server is scanned over by ClamAV using the latest definitions. When it is finished you will see your bash prompt again. Ideally, you see that Clam reports no infections like this:

Clamscan linux server

While it’s running, try to have a look online for what may have caused the infection and see if it ties up with your Clam results. Very often we see that WordPress plugins have caused the issue. Why them? Well, think about it:

WordPress is the most popular Content Management System out there

  1. It’s used worldwide
  2. It’s often installed at the click of a button using tools such as Softaculous, so it’s dead easy to install
  3. It’s free, ‘Open Source’ software so attackers know the code inside out (well GNU GPL actually)
  4. There are a huge amount of free plugins available from developers around the world, many who have a less-than-basic grasp of how to code securely. Even the good ones get caught out!

Now my third point above is not really fair. It kind of insinuates that Open Source software is more unreliable in the security stakes. Quite the opposite in fact, vulnerabilities get plugged very quickly if there is an active community of developers. However, the sheer ubiquity of WordPress leads to it being a target in much the same way that Microsoft Windows is. The gains for an attack on WordPress are much more than one for Drupal (for example) purely because of the user base.

Even if a vulnerability is plugged with an update pretty fast, it still relies on the user being aware of the problem, downloading the update and applying it BEFORE someone exploits it.  To this end, a daily Clam scan is not a bad idea unless your server has lots of files on it or not many resources available to run the scan in a timely fashion.

Moving on from this virus scan, I would suggest that we look at what email your server is sending out. I detail it in this article here:

Find what emails are being sent from a Linux server

 


Find what emails are being sent from a Linux server

find-emails-sent-from-linux-serverIn this series of articles I am trying to help server admins and owners of VPS or Dedicated servers to find viruses or malware on their servers. Part of the diagnosis of your system is to see what emails are being sent out and from which accounts. Since spammers like to use compromised servers, I believe that it makes sense to check regularly that the emails being sent out roughly match what you would expect to see.

I have servers that I host client websites on. If a client who usually sends out 20 emails a month suddenly sends out 500 then this is cause for concern and I would immediately investigate the server for malware.

On linux systems, Exim (the mail transfer agent) already logs the working directory of messages sent to the queue by a script. Here’s an example of what you would expect to see in an exim_mainlog file:

Note: I like to use Notepad++ to analyze these large text files within Windows as other editors aren’t quite up to the task.

So it looks like there’s some function of the ‘fredbloggs’ website that auto-backs up the database, then sends a related email notice to whatever email address the webmaster provides, in this case, fredbloggs@gmail.com. The working directory for the generation of that message was “/home/fredbloggs/public_html”. Nothing suspicious here as we have an auto-backup program installed on this WordPress-powered website. Nothing to see here, move along please…

Here’s another example:

Again, possibly normal but I’d raise the question whether Jane changed her email address on WordPress. If not, this is cause for concern.  It’s a kind of detective work where you need to step back and look at all of the evidence to compile a big picture.

So, let’s run this beauty of a command against the exim_mainlog to give us an idea from which working directories our server gets messages sent to the mail queue:

The exim_mainlog records the arrival and delivery of all emails. It explains where the mail came from, to which address it was delivered, the hostname of the server and more. Additional details can be added to this log file by using extended logging in exim. Your output would be something like this on most systems:

So within the last 30 days, the /cforms directory has sent 8 messages to the queue. Cforms is a defunct WordPress plugin and now, as such, unsupported by the developer against exploits. Would you expect that Jane’s website should do that? A result like this isn’t necessarily suspicious as this is normal contact form use. Something like this, however, would be VERY suspicious:

I can’t think of a valid reason why an ‘images’ directory should be sending mail, so alarm bells would trigger and that’s definitely something I would look into further.

So, presuming we saw strange usage numbers or a bizarre path, let’s dig even deeper and look at what the Subject of Jane’s emails actually were, as this gives us an indication of spam activity. Change directory into /var/log

Now run this:

Nice, it returns a list like this which tells us all we want to know:

Again, no cause for concern and the only spammy one there would be the first one, already marked as such by Akismet.

If you have lots of adverts for cheap meds or blue pills in there then you need to find the offending code that’s pushing spam through your email system. Start with a virus scan on your Linux server

Hope this helps and feel free to drop me a comment below.

 


Search everything plugin returns no posts

I came across a recent bug today on a client site where the excellent ‘Search Everything’ plugin was updated to the latest version (currently 8.1.3) and the search suddenly returned no results on the website.

I narrowed it down to the ‘category exclude’ option as unchecking this box in the admin area made the plugin work as it should again. As you can see below, I had just one category in there for exclusion:

 

search everything not working

 

Unfortunately, unchecking this also broke my client’s search functionality as they had over 2000 posts we had to exclude from their search results, all in that one category.

Examining the code a bit further, it seemed something was probably amiss in wp-content/plugins/search-everything/search-everything.php around line 735:

 

 

Glad to see that the developers have neatly laid out and commented the code, usually the sign of a decent plugin. I initially thought that escaping the apostrophes in the first reference to ‘page’ may work but it didn’t seem to. Here’s my temporary fix that works for my client until the developer can take a look:

 

 

If you are a bit unsure of messing with php files, do this:

  • FTP into your server
  • Copy search-everything.php to your PC (full path is wp-content/plugins/search-everything/search-everything.php)
  • Open it in a text editor such as Notepad (or better still the free and excellent Notepad++) and modify the code to read as above
  • Rename search-everything.php on your server to search-everythingORIG.php
  • Upload the search-everything.php file from your PC to the server in the same location as it was.
  • Test and do the happy dance if it works

If you do apply this, don’t forget to keep an eye out for the bugfix from the plugin developers.

Hope it works for you!

 

 


1and1 sites going to 404 error pages

If you’re seeing 404 error pages on your websites with 1and1 hosting today, then it may be down to the fact that 1and1 have forced migration to a newer database system. For the technical, this means that they switched off MySQL 4 and forced use of the newer and more secure MySQL 5.

The result? Well those sites that depend on a database (such as those powered by WordPress, Drupal etc) will not work unless upgraded.

https://www.facebook.com/notes/11-internet-inc/migrate-your-databases-to-mysql-51/10151353657669211

My advice would be to get a better host, I have seen lots of reports of poor support from 1and 1 for hosting at all levels. My personal preference is Servint who offer great support, good prices and rock-solid uptimes. Full review of Servint here


Online backup and coupon code for 20% off Mozy

Mozy online backup discount coupon codeOnline backup just got a whole lot cheaper with the latest coupon code from Mozy.   Click the link below and type in the coupon code ENCRYPTION for 20% discount:

Mozy online backup coupon code

Note: Enter the code into the promotional code box at signup to get the full discount.

 

Other recent contenders for our recommended backup software:

Crash Plan


GoDaddy 99 cent domains are back!

Godaddy cheap domain trickYes, GoDaddy 99 cent domains are back with this simple method and coupon code for December! It’s limited to 3 per account but does include existing GoDaddy account holders to purchase. I’ll show you below how to mix it up and get 6 domains for as low as $4.

At time of writing, 4USD = about 2.50GBP or 3.8AUD or 4.7 NZD or 3Euro

Start off by opening GoDaddy using this link (opens in a new window).

Sign up or login if you are already a customer.

First off, if you are from any country other than the US, set your primary currency to dollars. I’m outside the US but I keep it in this currency as it’s often where the better deals are.

Search for your 3 .com domains and add them to your basket.

Set all domains to 1 year duration using the dropdown menu.

Below each domain you see this:
YOURDOMAINNAME.INFO FREE with .COM or .CO^ – Add

Click the little ‘Add’ link for each one, this will add the free .info to your basket.

Verify your domains and that the corresponding .infos are all there, you should have 6 domains in total.

Now go to your Order Summary box on the right side of the page and add this special GoDaddy promotional coupon code:

LKSRTL99X

You should see that all 3 of your .coms have dropped to $0.99 (plus $0.18 tax) and that the .infos are completely free (with $0.18 sales tax). Something like this:

Godaddy 99 cent domain coupon code

 

Godaddy free info domain

 

At their current non-discounted prices (and GoDaddy are reasonable for their full-price domains) the basket would cost $82 for those 6 domains. Using this trick it comes down to a shade over $4.

That’s a $78 dollar saving, or 95% if you prefer!

Here’s what I have just ordered:

Godaddy 99 cent domains coupon deal

Yes that really is just over $4 for 6 domain names!!

 

Update: Working GoDaddy coupon codes for January 2013:

Enter code cjc295j1 for any domain at $2.95

Enter code gd3115c for any .info at $1.49

Enter code UNLOCKED for any .com at $1.17

Bookmark this page and check back for new codes before purchasing any domain!

 

Go straight to GoDaddy and register your domains now (link opens in new window).