I found a solution using procrustes with all permutations of the source points. The best transformation is the one with the minimum dissimilarity measure.
clearvars
%%Data
Source =[-52.00 0 0;
11.50 25.00 0;
53.00 0 0;
-20.00 -42.00 0];
Target =[ 0 0 2.71;
42.40 -23.23 0 ;
104.58 4.44 0 ;
70.90 45.19 0 ];
%%Procrustes
IndexPermutations = perms(1:size(Source,1)); % All permutations of the indices of Source
for i=1:length(IndexPermutations)
[D(i,1), ~, TFMs(i)] = procrustes(Target, Source(IndexPermutations(i,:),:), ...
'scaling',0, 'reflection',0); % Try procrustes with all permutations
end
[DMin, I_DMin] = min(D); % Get the index of the smallest dissimilarity measure
TFM = [[TFMs(I_DMin).T', TFMs(I_DMin).c(1,:)']; 0 0 0 1]; % Create the transformation
Source = Source(IndexPermutations(I_DMin,:),:);
Source_tfmd = transformPointsForward(affine3d(TFM'), Source);
rms(rms(Target-Source_tfmd))