Paquete jar de implementación de Linux, parámetros de línea de comando ocultos

La última inspección de seguridad del proyecto encontró que la contraseña de la base de datos en el archivo de configuración y la contraseña de redis aún se procesan en texto sin formato, por lo que
compilé un artículo: SpringBoot integra jasypt, encripta el archivo de configuración yml: https://blog.csdn.net /qq_38254635/article/details/132026841
El proceso es bastante tortuoso y se informó el error: No se pudieron vincular las propiedades en 'spring.datasource.password' a java.lang.String
Así que compilé un artículo: https://blog .csdn.net/qq_38254635/article/details/132027639

Todo está configurado y se encuentra un problema fatal. Usando ps -ef | grep java puede ver claramente la clave secreta, ¡está descifrada!

1. Requisitos de antecedentes

1. No cambie ningún código.
2. Oculte los parámetros de configuración en el comando de inicio nohup.

2. Acceder a la información

La mayoría de ellos se procesan de acuerdo con la idea de C, y los parámetros de configuración se escriben en la memoria por adelantado, y luego, al iniciar, apuntan a la configuración correspondiente a través del puntero para lograr el propósito de ocultar la configuración.
Según este enlace, aprendí un poco: https://zhuanlan.zhihu.com/p/610215116?utm_id=0

Tercero, date cuenta de la biblioteca oculta.

crear un nuevo directorio

cd /
mkdir test
cd test

3.1, prueba prueba.c

Agregar archivo de prueba

touch test.c

Programa de prueba: test.c

#include <stdio.h>

int main(int argc,char **argv){
    
    
	printf("argc=%d\n",argc);
	printf("argv[0]=%s\n",argv[0]);
	printf("argv[1]=%s\n",argv[1]);
	printf("argv[2]=%s\n",argv[2]);
	getchar();
	return 0;
}

Compilar el programa de prueba

gcc test.c

ejecutar programa de prueba

./a.out 123 456

inserte la descripción de la imagen aquí

ver el progreso

ps -ef

inserte la descripción de la imagen aquí

Los resultados de visualización del proceso, ejecute directamente los parámetros de la línea de comando e imprímalos directamente con el comando ps.
Todo lo que hay que hacer ahora es ocultar los siguientes parámetros.

3.2, establecer biblioteca oculta

Programa de biblioteca oculta hide.c

touch hide.c

Escribe el código hide.c

#define _GNU_SOURCE
#include <dlfcn.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int (*main_bak) (int, char **, char **);
/*
 * 所有的argv指向的内存先备份,然后全部改为*,再将argv指针指向备份内存
 */
static int mymain(int argc, char **argv, char **env) {
    
    
	int ret = 0,i = 0,len = 0;
	char **argvbak = NULL;
	if(argc > 1){
    
    
		argvbak=(char **)calloc(argc,sizeof(char *));
		for(i = 1;i < argc;i++){
    
    
			len = strlen(argv[i]);
			argvbak[i] = (char *)calloc(len,sizeof(char));
			strcpy(argvbak[i],argv[i]);
			strncpy(argv[i],"*",strlen(argv[i]));
			argv[i] = argvbak[i];
		}
	}
	ret = main_bak(argc, argv, env);
	if(argc > 1){
    
    
		for(i = 1;i < argc;i++){
    
    
			free(argvbak[i]);
		}
		free(argvbak);
	}
	return ret;
}
int (*__next_libc_start_main)(int (*main)(int, char **, char **),
	    int argc,
	    char **argv,
	    void (*init) (void),
	    void (*fini) (void),
	    void (*_fini) (void),
	    void (*stack_end));
int __libc_start_main(int (*main)(int, char **, char **),
		     int argc, char **argv,
		     void (*init)(void),
		     void (*fini)(void),
		     void (*_fini)(void),
		     void (*stack_end))
{
    
    
	__next_libc_start_main = dlsym(RTLD_NEXT, "__libc_start_main");
	main_bak = main;
	return __next_libc_start_main(mymain, argc, argv, init, fini, _fini, stack_end);
}

código de compilación hide.c

gcc -O2 -fPIC -shared -o hide.so hide.c -ldl

inserte la descripción de la imagen aquí

3.3 Verificación

Ejecute el programa con la ocultación de parámetros

LD_PRELOAD=./hide.so ./a.out 111 222

inserte la descripción de la imagen aquí
Ver proceso
inserte la descripción de la imagen aquí
Lo anterior está oculto

En cuarto lugar, el comando de inicio de la aplicación jar

El comando de inicio del proyecto original:

nohup java -jar -Djasypt.encryptor.password='1234qwer' /app/web.jar --server.port=8080 --spring.config.location=/app/web.yml >> /app/web.out 2>&1 &

Sobre esta base, puede usar la biblioteca oculta y agregar LD_PRELOAD antes del comando, de la siguiente manera:

LD_PRELOAD=./hide.so nohup java -jar -Djasypt.encryptor.password='1234qwer' /app/web.jar --server.port=8080 --spring.config.location=/app/web.yml >> /app/web.out 2>&1 &

Si lo inicia en otro lugar, puede usar una ruta absoluta:

LD_PRELOAD=/test/hide.so nohup java -jar -Djasypt.encryptor.password='1234qwer' /app/web.jar --server.port=8080 --spring.config.location=/app/web.yml >> /app/web.out 2>&1 &

Una vez completada la ejecución, ver el progreso del proyecto

ps -ef |grep java

inserte la descripción de la imagen aquí

5. Aplicación directa de resultados

1. Descargue directamente la
dirección CSDN del archivo .so: https://download.csdn.net/download/qq_38254635/88140515
Dirección del disco de red de Baidu: https://pan.baidu.com/s/1HcPlHjRpBsmUTU8GnAhKfg?pwd=dge1
Código de extracción : dge1

2. Póngalo en el servidor y agregue el siguiente comando antes de iniciar el comando.

LD_PRELOAD=/my/hide.so 

La dirección debe ajustarse según la ubicación del servidor.

Enlace de referencia:
el programa Java oculta los parámetros de la línea de comandos: https://www.5axxw.com/wenku/pg/5100338h.html
¿Cómo ocultar los parámetros de inicio del proceso? : https://www.zhihu.com/question/27518530
Pequeño golpe de Linux: ocultar los parámetros de la línea de comandos (no modificar el código fuente): https://zhuanlan.zhihu.com/p/610215116?utm_id=0

Supongo que te gusta

Origin blog.csdn.net/qq_38254635/article/details/132040657
Recomendado
Clasificación